将 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
为了对此进行扩展,我发现我需要做三件事:
- 将系统 属性“wicket.ioc.useByteBuddy”设置为由 Sven
指定的 true
- 添加对字节好友的依赖
- 升级到比我最初尝试做的更高的版本: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>
我正在尝试从 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
为了对此进行扩展,我发现我需要做三件事:
- 将系统 属性“wicket.ioc.useByteBuddy”设置为由 Sven 指定的 true
- 添加对字节好友的依赖
- 升级到比我最初尝试做的更高的版本: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>