首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迁移到CDI1.2焊接异常

迁移到CDI1.2焊接异常
EN

Stack Overflow用户
提问于 2018-06-28 15:42:11
回答 2查看 436关注 0票数 0

迁移到自由中的CDI 1.2之后,我的应用程序开始抛出一个焊接异常,我不清楚如何解决:

代码语言:javascript
复制
org.jboss.weld.exceptions.UnsatisfiedResolutionException: WELD-001334: Unsatisfied dependencies for type DataHandler with qualifiers @Any @DataHandlerBean WELD-001475: The following beans match by type, but none have matching qualifiers:
  - Session bean [class com.ibm.blueargus.feed.PathSquadHandler with qualifiers [@DataHandlerBean @Any]; local interfaces are [DataHandler],
  - Session bean [class com.ibm.blueargus.feed.DownAccessPointDataHandler with qualifiers [@DataHandlerBean @Named @Any]; local interfaces are [DataHandler],
  - Session bean [class com.ibm.blueargus.feed.ATTTicketDataHandler with qualifiers [@DataHandlerBean @Any]; local interfaces are [DataHandler],
  - Session bean [class com.ibm.blueargus.feed.WirelessClientDataHandler with qualifiers [@Named @DataHandlerBean @Any]; local interfaces are [DataHandler]

这种情况发生在我根据自定义注释值选择bean的地方--这是应用程序能够根据存储在数据库中的条件执行特定EJB实现的要求。如何更新代码以使用CDI1.1并仍然允许基于自定义限定符值的EJB实现的动态选择?有没有一种更好的方法能给我同样的共性呢?

限定符规范

代码语言:javascript
复制
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface DataHandlerBean {

   String value();

}

注释实现:

代码语言:javascript
复制
public class DataHandlerBeanQualifier extends AnnotationLiteral <DataHandlerBean> implements DataHandlerBean {

    private String value;

    public DataHandlerBeanQualifier (String value) {
        this.value=value;
    }

    @Override
    public String value() {
        return this.value;
    }

}

EJB接口:

代码语言:javascript
复制
@Local
public interface DataHandler {

    public void extractData (Monitor monitor, DataFeed dataFeed) throws Exception;

}

示例EJB实现:

代码语言:javascript
复制
@Stateless
@DataHandlerBean("downAccessPointHandler")
public class DownAccessPointDataHandler implements DataHandler {

导致问题的业务逻辑EJB:-- monitor.getDataHandler()中的值用于选择适当的EJB实现,以传递控制以供进一步处理。

代码语言:javascript
复制
@Stateless
public class DataScannerImpl implements DataScanner {

    public static Logger logger = Logger.getLogger(DataScanner.class.getName());

    @Inject
    @Any
    private Instance <DataHandler> dataHandlerInstance;

    private String processMonitorList(List <Monitor> monitorList, boolean forceLoad) {
        ...

        try {
            dataHandler = dataHandlerInstance.select(new DataHandlerBeanQualifier(monitor.getDataHandler())).get();
            dataHandler.extractData(monitor, dataFeed);
            monitor.setDataFeed(dataFeed);
        } catch ( Exception e ) {
            e.printStackTrace();
            logger.warn("Could not execute dataHandler: " + monitor.getDataHandler(), e);
        }

        ...
    }
}

在我以前的WebSphere v8.5生产环境中,这一切都很好。web应用程序正在使用CDI1.0。

当前环境(server.xml):

代码语言:javascript
复制
<featureManager>
    <feature>javaee-7.0</feature>
    <feature>webProfile-7.0</feature>
    <feature>ejbPersistentTimer-3.2</feature>
    <feature>ldapRegistry-3.0</feature>
    <feature>appSecurity-2.0</feature>
    <feature>localConnector-1.0</feature>
    <feature>jaxrs-2.0</feature>
    <feature>jaxrsClient-2.0</feature>
    <feature>servlet-3.1</feature>
    <feature>jpa-2.1</feature>
</featureManager>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-11 20:20:57

这个问题是由数据库值中的一个错误引起的,该错误导致monitor.getDataHandler()的值返回实际上不存在的bean名称。

票数 0
EN

Stack Overflow用户

发布于 2018-07-02 22:40:24

您必须有一个@Producer方法,它将被注入实现DataScanner接口的4个类

必须用4个不同的注释对这4个类进行注释。

根据您的业务逻辑,生产者将选择并“生成”正确的实现。

然后,您可以在需要时直接注入"DataScanner"

代码语言:javascript
复制
@Inject
private DataHandler dataHandlerInstance;

这在焊接文件中有描述。

在doc中,生产者在"PaymentProcessor"接口的两个实现之间进行选择:"@Synchronous PaymentProcessor syncPaymentProcessor""@Asynchronous PaymentProcessor asyncPaymentProcessor"

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51086871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档