当前位置: 首页 > 知识库问答 >
问题:

CDI:注入单个实例工作,但注入实例不工作。为什么啊?

段成益
2023-03-14

我试图在CDI注入的帮助下实现某种“插件特性”。但我遇到了一些麻烦,我想我可能会从我的同事“堆垛工”那里得到一些外部的观点:-)

到目前为止,我已经做到了这一点:

@Inject 
@ScoringModule("AGE")
private AgeModule ageModule;

@Inject 
@ScoringModule("CUSTOMER_TYPE")
private CustomerTypeModule customerTypeModule;

当我“运行”这个时,两个字段都会被注入相应的实例。但当我尝试像这样更“动态”地注入它们时:

@Inject @Any
private Instance<CustomerScoringModule> scoringModuleInstance;

CustomerScoringModule module = scoringModuleInstance.select(new ScoringModuleLiteral("AGE")).get();

然后我会得到这样一个例外:

org.jboss.weld.exceptions.UnsatisfiedResolutionException: WELD-001334: Unsatisfied dependencies for type CustomerScoringModule with qualifiers @Any @ScoringModule

这对我来说似乎很奇怪,因为CDI显然“知道”我感兴趣的实例,因为直接注入类型化字段是有效的。所以我想这一定和资格赛有关?不知何故,CDI“看到”了这两个实例,但决定它们都不适合我的注射请求?会是这样吗?

有没有什么“明显”的东西让我想到我可能做错了?我第一次尝试使用CDI,有可能(甚至可能)我在某个地方做了一些愚蠢的事情:-)

任何帮助或暗示都将受到感谢,并提前表示感谢!

下面我将附上限定词和注释文字等的“周围”类,以供参考。

这两个模块都实现的CustomorScoingInterface:

package de.otto.cccs.customerscoring.modules;

import de.otto.cccs.customerscoring.modules.vo.ScoringModuleResponseVO;
import de.otto.cccs.customerscoring.valueobjects.webservice.ScoringRequestVO;

public interface CustomerScoringModule {
    public ScoringModuleResponseVO process(ScoringRequestVO inputVO);
}

两个模块实现之一(它们现在只是虚拟实现,唯一的区别是log.info()方法中的输出,这就是为什么我这里只包含其中一个):

package de.otto.cccs.customerscoring.modules;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;

import de.otto.cccs.customerscoring.modules.qualifiers.ScoringModule;
import de.otto.cccs.customerscoring.modules.vo.ScoringModuleResponseVO;
import de.otto.cccs.customerscoring.valueobjects.webservice.ScoringRequestVO;
import lombok.extern.log4j.Log4j2;

@Log4j2
@Stateless
@LocalBean
@ScoringModule("AGE")
public class AgeModule implements CustomerScoringModule {

    public AgeModule() {
        super();
    }

    @Override
    public ScoringModuleResponseVO process(ScoringRequestVO inputVO) {
        log.info("processed AGE_MODULE");

        return new ScoringModuleResponseVO();
    }

}

@ScoringModule限定符:

package de.otto.cccs.customerscoring.modules.qualifiers;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.inject.Qualifier;

@Qualifier
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface ScoringModule {
    String value();
}

以及注释文字:

package de.otto.cccs.customerscoring.modules.qualifiers;

import javax.enterprise.util.AnnotationLiteral;

public class ScoringModuleLiteral extends AnnotationLiteral<ScoringModule> implements ScoringModule {

    private static final long serialVersionUID = 1L;
    private String value;

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

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

最后我空虚的beans.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee" 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/beans_1_0.xsd">
</beans>

共有1个答案

薛焱
2023-03-14

我最终将模块从EJB更改为普通Java类,所有的麻烦都消失了。

我并不真的需要这些模块是EJB的,我只是在一开始错误地认为它们必须通过CDI注入,现在不再是这样了(旧的J2EE版本是真的)

谢谢你的反馈!

 类似资料:
  • 我正在为我的项目使用android应用程序启动,柄和空间。尝试将工作排入队列时出现错误: 我的应用程序类: 我的工作人员: 最后,我对工作和刀柄的依赖关系:def hilt_version=‘2.41’def work_version=‘2.7.1’implementation“com.google.dagger:刀柄android:$hilt_version”kapt“com.gougle.da

  • 本文向大家介绍sql注入之手工注入示例详解,包括了sql注入之手工注入示例详解的使用技巧和注意事项,需要的朋友参考一下 前言 这篇文章就是一个最基本的SQl手工注入的过程了。基本上在sqlilabs上面的实验,如果知道了其中的全部知识点,都可以通过以下的步骤进行脱裤。下面的这个步骤也是其他的脱裤手段的基础。如果想要精通SQL注入,那么这个最基本的脱裤步骤是必须了解和掌握的。 为了方便说明,我们还是

  • 问题内容: 考虑以下请求范围的CDI bean: 现在,我将其注入到应用程序范围的bean中: 我运行了这段代码,并注意到两个请求之间的请求范围的Bean实例是不同的,但应用程序范围的Bean实例是相同的。我的疑问是:这如何运作?在每个请求时,是否将请求范围的Bean实例重新分配给应用程序范围的字段?还是应用程序范围的bean的代理只是在请求之间改变? 问题答案: 在CDI中,每个注入的对象实际上

  • 简介:在转储/恢复后,无法再从web应用程序连接到MariaDB。在Mariadb中处理PHP、mysql()和mysqli()接口的方式似乎有些不同。 MacOS X 10.6.8(雪豹)上的MariaDB 10.1.8,以及PHP 5.3.8和Apache 2.2.24。 由于磁盘驱动器出现故障,我遇到了“数据库崩溃”的情况,一些InnoDB表无法访问,最后导致服务器崩溃。我按照服务器错误日志

  • 我试图让CDI在tomcat 9.x中工作。我遵循了以下链接,但openwebbeans容器仍然没有将资源注入servlet https://devlearnings.wordpress.com/2011/05/15/apache-openwebbeans-cdi-from-standalone-to-webapp/https://dzone.com/articles/using-apache-o

  • 文件src/main/webapp/WEB-INF/web.xml包含用于引导CDI的servlet侦听器和BeanManager引用: 通过这些设置,在使用mvn Jetty运行应用程序时,我总是遇到以下错误:run(第一行是最重要的): 应用程序正在运行,但正如异常消息所述:CDI注入在servlet中不可用。 在src/main/resources/log4j.properties中,我增加