Jakarta ee 从GlassFish 3迁移到Payara 4-面临CDI启用问题

Jakarta ee 从GlassFish 3迁移到Payara 4-面临CDI启用问题,jakarta-ee,ejb,cdi,overriding,payara,Jakarta Ee,Ejb,Cdi,Overriding,Payara,我正在进行从GlassFish 3迁移到Payara 4的应用程序的POC。我已经在Payara中完成了所需的配置设置,如jdbc连接池、队列等。应用程序中有EJB组件,但它构建到war文件中,并在GlassFish 3服务器上部署和运行。但是,当我尝试在Payara 4上部署时,CDI错误显示为: 部署期间发生错误:加载应用程序时出现异常:CDI定义失败:HV000151:覆盖另一个方法的方法不得更改参数约束配置…. 错误堆栈跟踪: 原因:javax.validation.Constraint

我正在进行从GlassFish 3迁移到Payara 4的应用程序的POC。我已经在Payara中完成了所需的配置设置,如jdbc连接池、队列等。应用程序中有EJB组件,但它构建到war文件中,并在GlassFish 3服务器上部署和运行。但是,当我尝试在Payara 4上部署时,CDI错误显示为:

部署期间发生错误:加载应用程序时出现异常:CDI定义失败:HV000151:覆盖另一个方法的方法不得更改参数约束配置….

错误堆栈跟踪: 原因:javax.validation.ConstraintDeclarationException:HV000151:重写另一个方法的方法不得更改参数约束配置,。。。 位于org.hibernate.validator.internal.metadata.aggregated.rule.OverridingMethodMustNotAlterParameterConstraints.apply(OverridingMethodMustNotAlterParameterConstraints.java:24) 位于org.hibernate.validator.internal.metadata.aggregated.ExecutableMetaData$Builder.AssertCorrectionsOfConfiguration(ExecutableMetaData.java:460) 位于org.hibernate.validator.internal.metadata.aggregated.ExecutableMetaData$Builder.build(ExecutableMetaData.java:378) 位于org.hibernate.validator.internal.metadata.aggregated.BeanMetaDataImpl$BuilderDelegate.build(BeanMetaDataImpl.java:677)


由于CDI启用是Payara中添加的新功能,因此在将应用程序从GF的较低版本迁移到Payara时,必须进行一些配置更改,这似乎很难理解。那么,有没有办法在Payara上实际部署此war文件?

尝试在禁用隐式CDI的情况下部署war

  • 在管理控制台中,在部署应用程序时取消选中隐式CDI选项
  • 从控制台部署时,添加属性
    implicitCdiEnabled=false
    ,例如
    asadmin部署--properties=implicitCdiEnabled=false myapp.war
如果您是从IDE进行部署,或者不想在每次部署时禁用隐式CDI,您可以尝试将
beans.xml
文件添加到应用程序的WEB-INF文件夹中,配置将
bean发现模式设置为
none
,请参阅:


说明:在Payara 4和JavaEE7中,有一个新特性叫做隐式bean发现。这意味着如果一个JAR/WAR文件不包含
beans.xml
文件,一些类会自动转换为CDIBeans。如果您的应用程序不使用CDI或使用的库与CDI不兼容,这有时会导致问题。

我已从管理控制台部署war文件,并取消选中“隐式CDI”选项,但仍面临相同的问题。因为我想启用隐式CDI,所以在beans.xml文件中将bean发现模式设置为none,我没有遇到这个问题。但是,我在加载app时遇到异常:javax.ejb.CreateException:Singleton对象初始化失败。在服务器日志中,我发现在Singleton类中引用的Ejb对象引发了Null指针异常。因此,我猜现在修改beans.xml后,EJB对象不会被启动。似乎
覆盖方法mustnotalterParameterConstraints
的原始错误来自bean验证,而不是来自CDI。您能找到导致异常的代码部分吗?stacktrace表示,您的代码重写了一个对其参数具有bean验证约束的方法,并修改了重写方法中的约束,这是不允许的。stacktrace没有说明代码的哪一部分起作用。我无法共享原始代码。但是,虚拟场景如下所示:有一个EJB接口,其方法类似于--publicstringsave(stringinput);它的实现类重写了对其形式参数具有参数约束的方法,如--public String save(@NotNull String input);现在这在GlassFish3中有效,但Payara抛出了提到的错误。我试过两种方法,有/没有限制,在这种情况下,我没有得到这个错误。因为有很多ejb模块,所以我不想更改任何代码,而是想在配置级别处理它。看来,Bean验证规范添加了一个约束,用于将验证放置在子类型中:。这在GlassFish 3中没有实现,但在GlassFish 4和Payara 4以及任何JavaEE7服务器中都有应用。我认为,如果不更改代码,就无法迁移到Payara 4—您需要将约束从实现转移到接口。