2016-06-07 15 views
3

Ich habe einen einfachen Fall, wo ich einen REST-Service MyService, die mit einer Bean beanB des Typs BeanB injiziert werden sollte, die Schnittstelle BeanBInterface implementiert.Java EE Bean mit Schnittstelle nicht für die Injektion

org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type BeanBInterface with qualifiers @BeanBQualifier 
    at injection point [BackedAnnotatedField] @Inject @BeanBQualifier public com.example.MyService.beanB 
    at com.example.MyService.beanB(MyService.java:0) 

Der Rest Service::

import javax.ws.rs.Path; 
import javax.inject.Inject; 

@Path("/") 
public class MyService { 
    @Inject 
    @BeanBQualifier(BeanBQualifier.Type.PROD) 
    public BeanBInterface beanB; 

    public MyService() {} 
} 

Bean-Schnittstelle:

public interface BeanBInterface { 
} 

Bean Implementation: Die Störung, die ich erhalten, ist die klassische WELD-001408 unten gezeigt

import javax.ejb.Singleton; 
import javax.ejb.Startup; 
import javax.enterprise.inject.Produces; 

@Startup 
@Singleton 
@BeanBQualifier(BeanBQualifier.Type.PROD) 
public class BeanB implements BeanBInterface { 
    private String name = "B"; 

    public BeanB() {} 

    public String getName() {return name;} 

    public void setName(String name) {this.name = name;} 
} 

The Bean Qualifier

import javax.inject.Qualifier; 
import java.lang.annotation.Retention; 
import java.lang.annotation.Target; 
import static java.lang.annotation.ElementType.FIELD; 
import static java.lang.annotation.ElementType.TYPE; 
import static java.lang.annotation.RetentionPolicy.RUNTIME; 

@Qualifier 
@Retention(RUNTIME) 
@Target({FIELD, TYPE}) 
public @interface BeanBQualifier { 
    Type value(); 
    enum Type{PROD, TEST} 
} 

beans.xml (versuchte in META-INF/beans.xml und auch in versucht WEB-INF/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="annotated"> 
</beans> 

Ich habe auch versucht eine bean-discovery-mode="all" mit kein Glück.

Wenn ich mache die Erklärung von beanB die konkreten Klasse zu verwenden BeanB anstatt ihre Schnittstelle in MyService es funktioniert (aber das den Zweck einer Schnittstelle):

Wenn ich eine @Produces Factory-Methode zu MyService hinzufügen konstruieren die Bohne es funktioniert auch, aber diese Niederlagen der Zweck der Vermietung der Container für mich, meine Bohnen instanziiert:

@javax.enterprise.inject.Produces 
public static BeanB get() { 
    return new BeanB(); 
} 

aber wenn diese @Produces Factory-Methode, anstatt die Schnittstelle zurückgibt wird es nicht funktionieren:

@javax.enterprise.inject.Produces 
public static BeanBInterface get() { 
    return new BeanB(); 
} 
+0

Was ist der vollständige Name der '' '@ Singleton''' Anmerkung? stelle sicher, dass es sich um '' '' javax.ejb.Singleton''', nicht um '' '' javax.faces.bean.Singleton''' handelt. – maress

+0

Ja, ich benutze 'javax.ejb.Singleton' –

Antwort

2

EJBs haben einige seltsame Regeln darüber, welche Schnittstellen tatsächlich implementiert sind. Es werden nur Schnittstellen angezeigt, die als @ Local/@ Remote gekennzeichnet sind. Wenn Sie die Bean mit der Schnittstelle und mit der Klasse verwenden möchten, müssen Sie @LocalBean zum ejb hinzufügen.

Kurz gesagt: in @Local an der Schnittstelle oder @Local (BeanBInterface.class) zu BeanB