gpt4 book ai didi

cdi - 如果 bean 是 Java EE 7 (CDI 1.1) 中的 EJB bean,则 injectionPoint.getBean() 返回 null

转载 作者:行者123 更新时间:2023-12-04 15:42:12 24 4
gpt4 key购买 nike

我想从生产者方法中获取 bean 以读取其属性。在某些情况下,bean 是 EJB Singleton bean 角,扁 bean 。

我已经简化了我的代码以专注于这个问题。

我的简单限定符:

@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface InjectMe {}

简单的生产者:
@Dependent
public class SimpleProducer {

@Produces
@InjectMe
public String getInjectMe(InjectionPoint ip) {
// ip.getBean() returns null for some reason
return "ip=" + ip + ", bean=" + ip.getBean();
}
}

EJB(单例):
@Singleton
@Startup
public class SimpleSingleton {

@Inject
@InjectMe
private String injectMe;

@PostConstruct
public void init() {
System.out.println(injectMe);
}

}

控制台输出:

Info: ip=[BackedAnnotatedField] @Inject @InjectMe private com.test.ejb.SimpleSingleton.injectMe, bean=null



当我改变 Singleton bean 到 CDI bean 一切正常( ip.getBean() 返回非空)。它也适用于 Java EE 6即使与 Singleton bean 但它不在 Java EE 7 .我正在使用 Glassfish 4 应用程序服务器。

这种行为是否在某处指定?

最佳答案

使用

injectionPoint.getMember().getDeclaringClass()

在 WildFly 10.1.0 中对我有用,我也在 Payara Server 4.1.1.162 #badassfish(build 116)中快速测试了它。我还在全新的 Payara Server 4.1.1.164 #badassfish(build 28)上进行了测试。但是,我不得不将生产者 bean 的范围更改为 @ApplicationScoped。默认范围不起作用。就我而言,这甚至是有道理的:)


injectionPoint.getBean().getBeanClass()

方法在旧的 Payara 中对我有用,但在新的 WildFly 10.1.0.Final 和新的 Payara Server 4.1.1.164 #badassfish(构建 28)中无效。

如果您查看 Payara,当前新版本 164 包含 Weld 2.4.0.Final,WildFly 10.1.0Final 使用版本 2.3.5.Final。在这两个版本中,经典代码不起作用!

结论是,在较旧的 CDI 实现 (Weld) 上,它有效。在一些较新的 Weld(在 Payara 161 中引入)中,行为发生了变化。我不知道这是故意的还是无意的。

然而, 解决方法是使用
injectionPoint.getMember().getDeclaringClass()

并注释生产者 bean
@javax.enterprise.context.ApplicationScoped

注解。

关于cdi - 如果 bean 是 Java EE 7 (CDI 1.1) 中的 EJB bean,则 injectionPoint.getBean() 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34643780/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com