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();
}
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
Ja, ich benutze 'javax.ejb.Singleton' –