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

时间:2016-05-03 11:21:36

标签: java-ee glassfish cdi payara

我们目前正在将我们的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中是否存在一般性错误吗?

THX, 贝恩德

不幸的是,没有帮助。我做了一些调查,看起来只有一些"一些" 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);

如果我在&#34;类&#34;中提供接口类。参数返回值始终为null。

2 个答案:

答案 0 :(得分:0)

下载weld-servlet.jar并将其放入项目库中,或者更好,为什么不使用wildfly?他随身携带所有的罐子来运行cdi。

答案 1 :(得分:0)

<强>解决方案

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

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