使用 Payara 4.1.1 在不同的 JAR 中加载 CDI bean

Posted

技术标签:

【中文标题】使用 Payara 4.1.1 在不同的 JAR 中加载 CDI bean【英文标题】:Loading CDI beans in different JARs with Payara 4.1.1 【发布时间】:2016-05-03 11:21:36 【问题描述】:

我们目前正在将我们的 JEE 6 应用程序(WAR 部署)从 GF 3.1 移植到 Payara 4.1.1。我们正在使用 EJB 和 CDI bean。它们被打包在不同的 jar 文件中。我面临无法找到位于另一个 jar 文件中的 CDI bean 的问题。每个 jar 文件都有自己的 META-INF/beans.xml,还有一个用于 WAR (WEB-INF/beans.xml) 存档。我已经尝试了以下步骤:

采用 beans.xml (bean-discovery-mode="all") 在 EAR 部署中部署 WAR。 更改了随 CDI 1.1 更改的注释 将所有库更新到最新版本(richfaces、guava、eclipselink...)以满足 JEE 7 要求

有人知道 Glassfish/Payara 4.1.1 中是否存在一般错误吗?

谢谢, 伯恩德

不幸的是,这没有帮助。我做了一些更多的调查,似乎只有“一些”bean 不能正确地从 BeanManager 注入或检索。这里的类层次结构不起作用:

`// AllwaysFalse is our own annotation.
@AllwaysFalse
@Named
public class AllwaysFalseRemoteCondition<E extends IStandardEntity>
         extends ConditionBase<javax.persistence.criteria.Predicate, E>
         implements RemoteCondition<javax.persistence.criteria.Predicate, E>      

…


// The abstract base class
public abstract class ConditionBase<R, T extends IStandardEntity> implements      Condition<R, T> 


// The base interface
public interface RemoteCondition<T, E extends IStandardEntity> extends  Condition<T, E> 

public interface Condition<T, E extends IStandardEntity> extends Part<ConditionDescriptor> 
…

如果我将上面的类更改为:

public class AllwaysFalseRemoteBotCondition<E extends IStandardEntity> 

注射有效。

如果我尝试通过 BeanManager 注入 bean,如果我执行基于类型的搜索,getBeans() 方法将不起作用:

`BeanManager bm = getBeanManager();
    Set<Bean<?>> beans = bm.getBeans(clazz, annotations);

如果我在“类”参数中提供接口类,则返回值始终为空。

【问题讨论】:

没有我知道的错误。您是否在 server.log 中收到任何类型的错误消息?看到这些会有所帮助。您使用的是什么版本的 Payara?版本方案是年份的最后 2 位数字 + 季度数字。最新版本是 161.1(162 将在未来几天内发布) 【参考方案1】:

下载weld-servlet.jar并放入你项目的库中,或者更好,你为什么不使用wildfly?他携带所有罐子在您的应用程序中运行 cdi。

【讨论】:

不幸的是,这没有帮助。我做了一些更多的调查,似乎只有“一些”bean 不能正确地从 BeanManager 注入或检索。这里的类层次结构不起作用:【参考方案2】:

解决方案

Set<Bean<?>> beans = bm.getBeans(
    new TypeLiteral<RemoteCondition<javax.persistence.criteria.Predicate,?>>() 
    .getType(), 
    new AnnotationLiteral<AlwaysFalse>()

TypeLiteral 解决了这个问题!感谢 Payara 的支持!

【讨论】:

以上是关于使用 Payara 4.1.1 在不同的 JAR 中加载 CDI bean的主要内容,如果未能解决你的问题,请参考以下文章

包含EJB的Java 8 Compiled EAR导致Payara中的java.lang.NoClassDefFoundError

使用 cargo 插件在 payara 上部署

如何计划从 WebSphere 迁移到更便宜的应用程序服务器,如 JBoss、Tomcat 或 Payara

Tyrus 端点阻止 Glassfish (Payara) 中的线程

如何在 Payara 5.193 中配置数据网格 ttl

Payara 5 web.xml 中 PGSimpleDataSource 的自定义属性