org.jboss.weld.exceptions.UnsatisfiedResolution

我有一个 Java 8 项目和一个 JBoss 7.1.0GA 服务器。我有一个带有全局变量的批处理类


@EJB

public MyInterface delegate;

在我的 ejb-jar.xml 中定义为 DelegateClass 的一个实例:


<?xml version="1.0" encoding="UTF-8"?>

<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" version="3.1"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd">

    <module-name>moduleName</module-name>

<enterprise-beans>

    <session>

        <ejb-name>ejbName</ejb-name>

        <business-remote>MyInterface</business-remote>

        <ejb-class>DelegateClass</ejb-class>

        <session-type>Stateless</session-type>

    </session>

</enterprise-beans>

我有一些 MyInterface 的实现,所以在我的类 DelegateClass 中我想包装一个 MyInterface 的实现并通过枚举常量设置它。这里的代码:


@Stateless

@LocalBean

@TransactionAttribute(TransactionAttributeType.REQUIRED)

public class DelegateClass implements MyInterface {


@Inject

@Any

protected Instance<MyInterface> instance;


protected MyInterface selectedImpl;


@PostConstruct

public void init() {

    selectedImpl = instance.select(MyLiteralAnnotation.create(MyEnum.value)).get();

}

这是我的文字注释类的代码:


public class MyLiteralAnnotation extends AnnotationLiteral<MyAnnotation> implements MyAnnotation {


private final MyEnum value;


private MyLiteralAnnotation(MyEnum value) {

    this.value = value;

}


@Override

public MyEnum getValue() {

    return value;

}


public static MyLiteralAnnotation create(MyEnum value) {

    return new MyLiteralAnnotation(value);

}

}


我创建的注释:


@Retention(RetentionPolicy.RUNTIME)


@Target({ TYPE, METHOD, FIELD, PARAMETER, CONSTRUCTOR }) 

@Qualifier 

public @interface MyAnnotation {


MyEnum getValue();

}

以及我想从 instance.select(...) 中获得的实现


@Stateless

@LocalBean

@TransactionAttribute(TransactionAttributeType.REQUIRED)

@MyAnnotation(MyEnum.value)

public class MyInterfaceImpl implements MyInterface {

....

}

我在服务器上调试应用程序,但是当我尝试使用 instance.select(...) 实例化 selectImpl 字段时,出现异常:


org.jboss.weld.exceptions.UnsatisfiedResolutionException WELD-001334 带有限定符 @Any @MyAnnotation 的类型 MyInterface 的依赖关系不满足


有人能帮助我吗 ?


凤凰求蛊
浏览 108回答 2
2回答

跃然一笑

我解决了在委托类定义上添加注释 @ApplicationScope 的问题。

HUH函数

出现异常似乎是因为 CDI 没有找到使用 @Any 和 @MyAnnotation 注释的 bean,因为您要选择的 bean 仅使用 @MyAnnotation 进行了注释。我认为 @Any 在 Instance 注入中不是必需的,因为 Instance 将能够访问 MyInterface 的所有实现,因此您可以选择带有 @MyAnnotation(MyEnum.value) 注释的那个。我从来没有使用带有限定符的实例,它使用枚举。我认为您不需要使用 Instace。以下注入不起作用吗?class MyDelegate implements MyInterface{&nbsp; &nbsp;@Inject&nbsp; &nbsp;@MyAnnotation(MyEnum.value)&nbsp; &nbsp;private MyInterface myInterface;}如果您需要委托给另一个实现,那么您可能需要 CDI 装饰器。@Decorator@Default // We decorate the default implementation of MyInterface or any qualified&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// one you need to decorateabstract class MyDecorator implements MyInterface {&nbsp; &nbsp;@Inject&nbsp; &nbsp;@MyAnnotation(MyEnum.value)&nbsp; &nbsp;private MyInterface myInterface;&nbsp; &nbsp;@Inject&nbsp; &nbsp;@Delegate&nbsp; &nbsp;private MyInterface delegate;&nbsp; &nbsp;// Implement all methods you want to decroate&nbsp; &nbsp;public void myMethod(){&nbsp; &nbsp; &nbsp; if(condition) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;myInterface.myMethod();&nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;delegate.myMethod();&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp;}}您需要在 beans.xml 中注册装饰器<decorators>&nbsp; &nbsp; <class>MyDecorator</class></decorators>&nbsp; &nbsp;&nbsp;这对你有帮助吗?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java