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

CDI单元测试失败,限定符类型存在未满足的依赖项异常

贺亦
2023-03-14

嗨,我定义了以下限定符类型。。

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.FIELD })
public @interface SortAndFilterType {

/**
 * The value for the sort and filter.
 *
 * @return the sort and filter type value.
 */
String value();
}

还有两个实现。

@SortAndFilterType("Users")
public class UserSortAndFilterProviderImpl implements SortAndFilterProvider<Field, User>       {}

@SortAndFilterType("ReportsList")
public class ReportListSortAndFilterProviderImpl implements SortAndFilterProvider<Field, ReportList> {}

我从客户那里注射。。

@Inject
@SortAndFilterType("Users")
private SortAndFilterProvider mSortAndFilterProvider;

在运行时,每件事情都可以正常工作。。

但是当我运行单元测试时,问题就来了。。

我得到以下例外情况。。

组织。jboss。焊接例外情况。DeploymentException:WELD-001408:SortAndFilterProvider类型的未满足依赖项,在注入点[BackedAnnotatedField]@Inject@SortAndFilterType private com处具有限定符@SortAndFilterType。协作网。ctf。土星。客户应用程序。用户。ChangeUsersStatus。mSortAndFilterProvider

我从这样的单元测试中调用它。。它与@RunWith(CdiRunner.class)一起运行

@Produces
@SortAndFilterType("Users")
@Mock
private SortAndFilterProvider mSortAndFilterProvider;

这里怎么了?

共有2个答案

陆星文
2023-03-14

嗨,这正是问题所在。我的运行时使用JBoss7,测试环境使用CDI2。十、

将类型参数添加到注入点后,它工作得非常好。

多谢了。

吴单鹗
2023-03-14

CDI的一个好处(这对你来说是个问题)是它的类型安全解析考虑了参数化类型中的参数。换句话说:“CDI中没有类型擦除”规范对参数化类型解析非常详细:

如果参数化bean类型具有相同的原始类型,并且对于每个参数:

>

  • 所需类型参数和bean类型参数是具有相同原始类型的实际类型,并且,如果类型被参数化,bean类型参数可根据这些规则分配给所需类型参数,或者

    所需的类型参数是通配符,bean类型参数是实际类型,实际类型可分配给通配符的上限(如果有),并可从通配符的下限(如果有)分配,或

    所需的类型参数是通配符,bean类型参数是类型变量,类型变量的上限可分配给通配符的上限(如果有),或可从通配符的下限(如果有)分配,或

    所需的类型参数是实际类型,bean类型参数是类型变量,实际类型可分配给类型变量的上限(如果有),或者

    必需的类型参数和bean类型参数都是类型变量,并且必需类型参数的上限可以分配给bean类型参数的上限(如果有)。

    您可以在此处阅读原文:http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#assignable_parameters.

    现在焊接1。x对这一点要求不够严格,无法接受将参数化类型分配给其原始类型。这可能就是为什么您在运行时(例如使用JBoss AS 7.x运行)没有问题,并且在测试中有这个问题(cdi runner可能使用Weld 2.x)。是的,我在这里猜测,我可能错了,这就是为什么给出您在问题中使用的框架版本总是一件好事。

    无论如何,你应该通过改变你的注射点来解决你的问题

    @Inject
    @SortAndFilterType("Users")
    private SortAndFilterProvider<Field,?> mSortAndFilterProvider; 
    

    它遵守规范,将在焊缝1下工作。x和2。十、

    顺便说一句,你可能不需要你的限定词,因为在以下两者之间不会有任何歧义:

    @Inject
    private SortAndFilterProvider<Field,User> mSortAndFilterProvider1;
    

    @Inject
    private SortAndFilterProvider<Field,ReportList> mSortAndFilterProvider2;
    

  •  类似资料:
    • 我正在尝试将两个独立的战争迁移到一个耳朵里。 运行在WebLogic 12.2.1上,所以Java EE 7(CDI 1.1和EJB 3.1)。 每个WAR都包含相同的JAR库,其中包含许多@Stateless EJB和@Named CDI托管bean: 我已经执行了几个必需的步骤: 将包含ejb和CDI托管bean的ejb-cdi.jar的打包类型更改为ejb 将ejb-cdi.jar配置为po

    • 我确实遇到了与这里所解释的相同的问题:JBOSS7.1.3:@EJB工作而@Inject失败,这可能是相同的设置(Wildfly 8.0)。 尽管有一个带有producer的资源类,但我不能注入一个Logger实例。Neiter在控制器中,也不在EJB中。“问题1”如果我错了,请纠正我,我应该可以将它们注入@model bean和注有@stateless(EJB)的bean中,不是吗? 下面是我的

    • 我在JBoss上部署我的Java应用程序时遇到了一个愚蠢的问题。在我使用接口类更改源代码之前,一切都很好。所以这是我的问题: ... 在JBoss 7.1上部署时会出现以下错误: 10:05:34838错误[org.jboss.msc.service.fail](msc服务线程1-6)MSC00001:无法启动服务jboss。部署。单元“mdk-exchange-1.1.0.战争”。WeldSer

    • 我是CDI的新手。这是我的第一个例子,我正在尝试运行它。在互联网上搜索后,我编写了以下代码:我想要注入的类 servlet 我做错了什么?

    • 我有以下代码来管理两种存储库。这两个存储库类都继承了一个接口,以允许重新初始化它们的资源。 全球应用范围回购: 每个用户,会话范围的回购: 将此(不带)注入上下文时 但是,当向UserRepository类添加时,部署失败,例外情况如下: 添加CDI bean的名称,如 会导致相同的异常。唯一与一起工作的是使用var声明中的接口: 然而,我可能需要子类功能,所以使用并不是真正需要的(目前)。 问题