Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未为注入创建接口的Java EE bean_Java_Jakarta Ee_Ejb_Cdi_Weld - Fatal编程技术网

未为注入创建接口的Java EE bean

未为注入创建接口的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

我有一个简单的例子,我有一个REST服务
MyService
,它应该被注入类型为
beanB
的bean
beanB
,它实现了接口
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)添加到BeanB

Singleton注释的完全限定名是什么?确保它是
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();
}