我们目前正在将我们的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)存档。我已经尝试了以下步骤:
有人知道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。
答案 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支持!