У меня есть простой случай, когда у меня есть служба REST MyService
, которая должна быть введена фасолью beanB
типа BeanB
, которая реализует интерфейс BeanBInterface
. Я получаю ошибку классический WELD-001408 один показано ниже:Java EE bean с интерфейсом, который не создается для инъекций
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)
The 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 Интерфейс:
public interface BeanBInterface {
}
Bean Реализация:
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;}
}
Бин Классификатор
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 (пробовали в META-INF/beans.xml, а также пытались в 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>
Я также попробовал bean-discovery-mode="all"
с не повезло.
Если я декларирование beanB
использовать конкретный класс BeanB
, а не его интерфейс в MyService
он работает (но это побеждает цель интерфейса):
Если добавить метод @Produces
фабричный MyService
к построить боб также работает, но это поражение цели позволить контейнер инстанцирует мои бобы для меня:
@javax.enterprise.inject.Produces
public static BeanB get() {
return new BeanB();
}
но если этот метод фабрики @Produces возвращает интерфейс вместо этого он не будет работать:
@javax.enterprise.inject.Produces
public static BeanBInterface get() {
return new BeanB();
}
Будет полное имя '' '@ Singleton''' аннотацию? убедитесь, что это '' 'javax.ejb.Singleton''', а не' '' javax.faces.bean.Singleton''' – maress
Да, я использую 'javax.ejb.Singleton' –