未为注入创建接口的Java EE bean
我有一个简单的例子,我有一个REST服务未为注入创建接口的Java EE bean,java,jakarta-ee,ejb,cdi,weld,Java,Jakarta Ee,Ejb,Cdi,Weld,我有一个简单的例子,我有一个REST服务MyService,它应该被注入类型为beanB的beanbeanB,它实现了接口BeanBInterface。我得到的错误是经典的WELD-001408,如下所示: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type BeanBInterface with qualifiers @BeanBQualifier at
MyService
,它应该被注入类型为beanB
的beanbeanB
,它实现了接口BeanBInterface
。我得到的错误是经典的WELD-001408,如下所示:
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)
其余服务:
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;}
}
Bean限定符
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中也尝试过)
但如果此@products factory方法返回接口,则它将不起作用:
@javax.enterprise.inject.Produces
public static BeanBInterface get() {
return new BeanB();
}
EJB有一些奇怪的规则,关于在实现时实际公开哪些接口。只有标记为@Local/@Remote的接口才会公开。如果希望将bean与接口和类一起使用,则需要将@LocalBean添加到ejb中
简言之:将@Local添加到接口或将@Local(BeanBInterface.class)添加到BeanBSingleton注释的完全限定名是什么?确保它是
javax.ejb.Singleton
,而不是javax.faces.bean.Singleton
是的,我使用的是javax.ejb.Singleton
@javax.enterprise.inject.Produces
public static BeanB get() {
return new BeanB();
}
@javax.enterprise.inject.Produces
public static BeanBInterface get() {
return new BeanB();
}