无法解析类型为xxx的任何bean;限定符:[@javax.enterprise.inject.Any()]

无法解析类型为xxx的任何bean;限定符:[@javax.enterprise.inject.Any()],java,dependency-injection,cdi,weld,Java,Dependency Injection,Cdi,Weld,我有一个LoginProvider界面: public interface LoginProvider { boolean login(String username, String password); } 和两种不同的实现: public class LoginProvider1Impl implements LoginProvider { @Override public boolean login(String username, String password

我有一个LoginProvider界面:

public interface LoginProvider {
    boolean login(String username, String password);
}
和两种不同的实现:

public class LoginProvider1Impl implements LoginProvider {
    @Override
    public boolean login(String username, String password) {
        ...
    }
}

public class LoginProvider2Impl implements LoginProvider {
    @Override
    public boolean login(String username, String password) {
        ...
    }
}
然后是生产者注释:

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({FIELD, METHOD, PARAMETER, TYPE, CONSTRUCTOR})
    public @interface LoginProviderProducer {
}
用于指定登录提供程序实现的注释:

@Retention(RetentionPolicy.RUNTIME)
@Target({FIELD, METHOD, TYPE})
public @interface LoginProviderType {
    LoginProviderName value();

    public enum LoginProviderName {

        PROVIDER1(LoginProvider1Impl.class),
        PROVIDER2(LoginProvider2Impl.class);

        private Class<? extends LoginProvider> loginProviderType;

        private LoginProviderName(Class<? extends LoginProvider> loginProviderType) {
            this.loginProviderType = loginProviderType;
        }

        public Class<? extends LoginProvider> getLoginProviderType() {
            return loginProviderType;
        }
    }
}
使用帮助器时,我会出现以下错误:

org.jboss.weld.exceptions.UnsatisfiedResolutionException:
WELD-001308: Unable to resolve any beans for Type:
class com.xxx.LoginProvider1Impl; Qualifiers: [@javax.enterprise.inject.Any()]

谢谢

我在LoginProvider1Impl和LoginProvider2Impl中添加了注释
@ApplicationScoped

另一种方法是修改factory方法:

@ApplicationScoped
public class LoginProviderFactory {

    @Produces
    @LoginProviderProducer
    public LoginProvider createLoginProvider(@Any Instance<LoginProvider> instance, InjectionPoint injectionPoint) {
        Annotated annotated = injectionPoint.getAnnotated();
        LoginProviderType loginProviderTypeAnnotation = annotated.getAnnotation(LoginProviderType.class);
        Class<? extends LoginProvider> loginProviderType = loginProviderTypeAnnotation.value().getLoginProviderType();
        //return instance.select(loginProviderType).get();
        if (loginProviderType == LoginProvider1Impl.class) {
            return new LoginProvider1Impl();
        } else if (loginProviderType == LoginProvider2Impl.class) {
            return new LoginProvider2Impl();
        } else
            return null;
    }
}
@ApplicationScoped
公共类LoginProviderFactory{
@产生
@LoginProviderProducer
public LoginProvider createLoginProvider(@Any实例实例,InjectionPoint InjectionPoint){
Annotated=injectionPoint.getAnnotated();
LoginProviderType loginProviderTypeAnnotation=annotated.getAnnotation(LoginProviderType.class);

ClassLoginProvider1Impl是否确实是部署的一部分?或者是否不缺少beans.xml?我有另一个可用的生产者(一个没有类型/枚举的更简单生产者)所以我猜DI是有效的。关于LoginProvider1Impl不是部署的一部分,你是什么意思?怎么可能没有部署该类?除了帮助程序(但相同的项目)之外,所有的类都在同一个包中。你应该在调试级别(org.jboss.weld DEBUG)打开weld的日志记录然后在发现阶段查找LoginProvider1ImplBean,看看它是否列出并且没有问题。实际上,在重新阅读您的第一条评论后,我想到了bean实例化,并将@ApplicationScoped添加到我的2 LoginProvider实现中,它似乎可以工作……我想,我期望工厂创建它们是错误的我对另一个真正创建bean(而不是使用Instance和InjectionPoint)的生产者感到困惑。
org.jboss.weld.exceptions.UnsatisfiedResolutionException:
WELD-001308: Unable to resolve any beans for Type:
class com.xxx.LoginProvider1Impl; Qualifiers: [@javax.enterprise.inject.Any()]
@ApplicationScoped
public class LoginProviderFactory {

    @Produces
    @LoginProviderProducer
    public LoginProvider createLoginProvider(@Any Instance<LoginProvider> instance, InjectionPoint injectionPoint) {
        Annotated annotated = injectionPoint.getAnnotated();
        LoginProviderType loginProviderTypeAnnotation = annotated.getAnnotation(LoginProviderType.class);
        Class<? extends LoginProvider> loginProviderType = loginProviderTypeAnnotation.value().getLoginProviderType();
        //return instance.select(loginProviderType).get();
        if (loginProviderType == LoginProvider1Impl.class) {
            return new LoginProvider1Impl();
        } else if (loginProviderType == LoginProvider2Impl.class) {
            return new LoginProvider2Impl();
        } else
            return null;
    }
}