Dependecy Injection不起作用

时间:2016-07-01 19:44:50

标签: java java-ee cdi wildfly-10

我的资格赛是:

@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方法。

2 个答案:

答案 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时,行为可能略有不同,但这只是猜测。