使用 Payara 4.1.1 在不同的 JAR 中加载 CDI bean
Loading CDI beans in different JARs with Payara 4.1.1
我们目前正在将我们的 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")
- 部署 WAR 内部和 EAR 部署。
- 更改了随 CDI 1.1 更改的注释
- 将所有库更新到最新版本(richfaces、guava、eclipselink 等)以满足 JEE 7 要求
有人知道 Glassfish/Payara 4.1.1 中是否存在一般错误吗?
谢谢,
伯恩德
不幸的是,这没有帮助。我做了更多调查,似乎只有 "some" 个 bean 无法从 BeanManager 正确注入或检索。这里的 class 层次结构不起作用:
`// 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> {
…
}
如果我把上面的class改成:
public class AllwaysFalseRemoteBotCondition<E extends IStandardEntity> {
}
注入有效。
如果我尝试通过 BeanManager 注入 bean,则 getBeans() 方法在我进行基于类型的搜索时不起作用:
`BeanManager bm = getBeanManager();
Set<Bean<?>> beans = bm.getBeans(clazz, annotations);
如果我在 "class" 参数中提供接口 class,则 return 值始终为空。
下载 weld-servlet.jar 并放入您项目的库中,或者更好,为什么您不使用 wildfly?他将所有罐子带到您应用程序中的 运行 cdi。
解决方法:
Set<Bean<?>> beans = bm.getBeans(
new TypeLiteral<RemoteCondition<javax.persistence.criteria.Predicate,?>>() {}
.getType(),
new AnnotationLiteral<AlwaysFalse>(){}
TypeLiteral 解决了这个问题!感谢 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")
- 部署 WAR 内部和 EAR 部署。
- 更改了随 CDI 1.1 更改的注释
- 将所有库更新到最新版本(richfaces、guava、eclipselink 等)以满足 JEE 7 要求
有人知道 Glassfish/Payara 4.1.1 中是否存在一般错误吗?
谢谢, 伯恩德
不幸的是,这没有帮助。我做了更多调查,似乎只有 "some" 个 bean 无法从 BeanManager 正确注入或检索。这里的 class 层次结构不起作用:
`// 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> {
…
}
如果我把上面的class改成:
public class AllwaysFalseRemoteBotCondition<E extends IStandardEntity> {
}
注入有效。
如果我尝试通过 BeanManager 注入 bean,则 getBeans() 方法在我进行基于类型的搜索时不起作用:
`BeanManager bm = getBeanManager();
Set<Bean<?>> beans = bm.getBeans(clazz, annotations);
如果我在 "class" 参数中提供接口 class,则 return 值始终为空。
下载 weld-servlet.jar 并放入您项目的库中,或者更好,为什么您不使用 wildfly?他将所有罐子带到您应用程序中的 运行 cdi。
解决方法:
Set<Bean<?>> beans = bm.getBeans(
new TypeLiteral<RemoteCondition<javax.persistence.criteria.Predicate,?>>() {}
.getType(),
new AnnotationLiteral<AlwaysFalse>(){}
TypeLiteral 解决了这个问题!感谢 Payara 的支持!