将 Wicket 9.0.0 升级到 9.3.0:尝试访问数据库时出现运行时错误

Upgrading Wicket 9.0.0 to 9.3.0: runtime error when try to access database

我正在尝试从 Wicket 9.0.0 升级到 Wicket 9.3.0。当我在快速启动应用程序中更改版本时,一切正常。

问题出现在我的实际应用程序中,我们最初使用的是 Jakarta Enterprise Beans 8.0.0。在 运行 时,当尝试访问数据库时,我们收到异常并显示以下消息:

最后一个原因:net.sf.cglib.proxy.MethodInterceptor 未被 org.objectweb.asm [23]

找到

尝试改用 Jakarta EE 9.1

我改变了我的 pom.xml 如下:

        <jakartaee>9.1.0</jakartaee>
        <wicket.version>9.3.0</wicket.version>

我下载了 Jakarta EE 9.1 的 jar,在整个应用程序中将“javax”更改为“jakarta”,重建它并再次尝试 运行。

结果仍然不完美,但比以前好得多:一个普通的旧空指针异常,而不是关于 cglib 的任何奇怪错误。

下面是导致问题的代码部分:

    @EJB(name = "AdminNotesFacade")
    private AdminNotesFacade adminNotesFacade;


    public AdminNotesFacade getAdminNotesFacade() {
        return adminNotesFacade; //ACTUALLY RETURNS NULL
    }

所以现在最大的问题是:我需要 do/change 什么才能使 @EJB 工作而不是返回 null?

检查 Payara 日志,我收到此错误:

java.lang.RuntimeException: 无法加载 EJB 模块。 DeploymentContext 不包含任何 EJB。检查存档以确保正确打包 D:\Dev\icase2\target\icase2。 如果您使用 EJB 组件注释来定义 EJB,并且还使用了 ejb 或 web 部署描述符,请确保部署描述符引用 Java EE 5 或更高版本的架构,并且元数据完整属性没有设置为true,所以组件注解可以按预期处理 在 org.glassfish.ejb.startup.EjbDeployer.prepare(EjbDeployer.java:189)

添加更多详细信息,2022-05-06

当我们认为可以通过升级我们的 jakartaee 版本来解决这个问题时,我想知道我们是否走错了路。从 Wicket 9.0 到 9.3 只是次要版本的更改,您不会期望必须进行此类基本更改才能使次要升级正常工作。

我试过使用 Wicket 9.9.1,以防这个问题在更新的版本中得到修复,但它完全一样。

无论如何,我已经基于 Wicket 自己的模板创建了一个非常小的“快速启动”应用程序来重现该问题。我坚持使用原始的“javax”版本,并且只添加了一个 EJB - 一个 JavaMail bean。我认为知道这不是一个特定的数据库相关问题可能很有趣。我们似乎根本无法加载任何 EJB。

在 Wicket 9.0.0 版本中,主页上显示了一个简单的表单,允许用户输入他们的电子邮件地址。当他们提交表单时,测试消息会发送到该地址。它工作正常。

然后,如果我将 Wicket 版本更改为 9.3.0 但根本不做任何其他更改,它甚至不会进入显示主页的阶段,它会立即崩溃并显示消息“最后原因:net.sf.cglib.proxy.MethodInterceptor org.objectweb.asm [23]

未找到

不管怎样,这里是触发错误的代码。

    public class HomePage extends WebPage {

        @EJB(name = "EmailerFacade")
        private EmailerFacade emailerFacade;

        private static final long serialVersionUID = 1L;

        private String sendTo = "";

        public HomePage(final PageParameters parameters) {
            super(parameters);

            add(new Label("version", getApplication()
                .getFrameworkSettings().getVersion()));

            FeedbackPanel feedback = new FeedbackPanel("feedback");
            add(feedback);

            final Form emailForm = new Form("emailForm") {
                @Override
                protected void onSubmit() {
                    emailerFacade.sendMessage(sendTo, "Test message from quick-start", 
                            "Version is " + getApplication().getFrameworkSettings()
                                    .getVersion());
                    info("Tried to send message to " + sendTo);
                }
            };
            add(emailForm);

            final TextField<String> emailAddress = new TextField<>("emailAddress", 
                new PropertyModel<>(this, "sendTo"));
            emailAddress.setLabel(Model.of("Email address"));
            emailAddress.setRequired(true);
            emailForm.add(emailAddress);
        }
    }

Wicket 9.x 基于 javax.servlet API。要将其部署在 jakarta.servlet 支持的 Web 容器上,您需要使用 https://github.com/apache/tomcat-jakartaee-migration.

之类的工具迁移字节码

我不确定 Payara 是否在运行时做了一些聪明的事情来支持 javax.**jakarta.** 类。

Tomcat 10.x 通过在特殊的 $CATALINA_HOME/webapps-javaee 文件夹中部署您的应用程序,支持在应用程序启动时迁移 类。

这个答案其实是斯文梅尔提供的。他评论道:

Use the new system property to switch to ByteBuddy in Wicket 9.x:

-Dwicket.ioc.useByteBuddy=true

为了对此进行扩展,我发现我需要做三件事:

  1. 将系统 属性“wicket.ioc.useByteBuddy”设置为由 Sven
  2. 指定的 true
  3. 添加对字节好友的依赖
  4. 升级到比我最初尝试做的更高的版本:9.3.0 不够好。我在 Sven 上面的评论中看到,他说迁移到 byte buddy 实际上是在 9.5 中完成的。所以实际上我升级到了最新版本,目前是9.9.1.

这里是我添加的字节好友的依赖:

            <dependency>
                <groupId>net.bytebuddy</groupId>
                <artifactId>byte-buddy</artifactId>
                <version>1.12.10</version>
            </dependency>