2016-07-01 19 views
0

mein Qualifier Arbeits ist:Dependecy Injection nicht

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

dies die Bohne ist, dass ich

@JPADAOQ 
@ApplicationScoped 
public class PlotDaoImpl extends JpaDao<Long, Plot> implements PlotDao { 
    public PlotDaoImpl() { 
     super(Plot.class); 
    } 
} 

injizieren wollen endlich da ist, wo ich meine Bohne wollen

@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"); 
     } 
    } 
injiziert werden

Aber ich habe es immer null, also kann ich es nicht benutzen.

Meine Konfiguration:
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 basierend auf Wildfly quickstart Form 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> 

Ich kann nicht herausfinden, warum meine Bohne nicht Int @ PostConstruct-Methode injiziert wird.

Antwort

2

@javax.faces.bean.ApplicationScoped Geben Sie an, dass die JSF-verwaltete Bean Anwendungsbereich ist, Sie jedoch als verwaltete Bean annotieren müssen.

@javax.enterprise.context.ApplicationScoped ist eine CDI Geschichte. Du musst es irgendwie herstellen. Fügen Sie möglicherweise eine Methode in PlotDaoImpl hinzu, die mit @Produces annotiert ist und this zurückgibt.

0

Erstens nehme ich an, dass Ihr @ApplicationScoped tatsächlich javax.enterprise.context.ApplicationScoped ist. Obwohl es nicht schaden würde, wenn es nicht als all Discovery-Modus wird immer noch die Klasse als Bean auswählen.

Zweitens, @ManagedBean Annotation kann entfernt werden, da der CDI automatisch die Klasse als managed bean abholen wird.

Und drittens stellen Sie sicher, dass Sie tatsächlich eine aktive Sitzung haben, wenn Sie Ihre PlotController testen. Sie müssen CDI die PlotController Bean für Sie erstellen lassen, um die Injektion zu machen.

Wenn nichts anderes hilft, können Sie versuchen, @SessionScoped durch @RequestScoped zu ersetzen, da das Verhalten sich leicht unterscheiden kann, wenn es um die Verfügbarkeit der Bean during @PostConstruct methods geht, aber das ist nur eine Vermutung.