我的资格赛是:
@Qualifier
@Target({ TYPE, METHOD, PARAMETER, FIELD })
@Retention(RUNTIME)
@Documented
public @interface JPADAOQ {
}
这是我想要注入的bean
@JPADAOQ
@ApplicationScoped
public class PlotDaoImpl extends JpaDao<Long, Plot> implements PlotDao {
public PlotDaoImpl() {
super(Plot.class);
}
}
最后,我希望我的bean被注入
@ManagedBean
@SessionScoped
public class PlotController {
@Inject @JPADAOQ
private PlotDaoImpl plotDaoImpl;
@PostConstruct
public void init() {
if (plotDaoImpl==null) {
System.out.println("plotDaoImpl null");
} else {
System.out.println("plotDaoImpl not null");
}
}
但我总是把它弄为零,所以我不能用它。
我的配置:
的 1.beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="all">
</beans>
2.pom.xml 基于wildfly快速入门形式here。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.jboss.spec</groupId>
<artifactId>jboss-javaee-7.0</artifactId>
<version>${version.jboss.spec.javaee.7.0}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.spec.javax.annotation</groupId>
<artifactId>jboss-annotations-api_1.2_spec</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.spec.javax.servlet</groupId>
<artifactId>jboss-servlet-api_3.1_spec</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
我无法弄清楚为什么我的bean没有注入@PostConstruct方法。
答案 0 :(得分:2)
@javax.faces.bean.ApplicationScoped
指定JSF托管bean是应用程序范围的,但您必须注释为托管bean。
@javax.enterprise.context.ApplicationScoped
是一个CDI故事。你必须以某种方式生产它。也许在PlotDaoImpl中添加一个用@Produces注释的方法,返回this
。
答案 1 :(得分:0)
首先,我假设您的@ApplicationScoped
实际上是javax.enterprise.context.ApplicationScoped
。虽然如果不是因为all
发现模式仍会选择该类作为bean,它不会造成伤害。
其次,@ManagedBean
注释可以被移除,因为CDI会自动将该类作为managed bean来接收。
第三,确保在测试PlotController
时确实有一个活动会话。你必须让CDI为你创建PlotController
bean才能使注射工作。
如果其他方面没有帮助,您可以尝试将@SessionScoped
替换为@RequestScoped
,因为当涉及到bean可用性during @PostConstruct
methods时,行为可能略有不同,但这只是猜测。