【问题标题】:WELD-001408 Unsatisfied dependencies for type [...] with qualifiers [@Named]WELD-001408 带有限定符 [@Named] 的类型 [...] 的依赖关系不满足
【发布时间】:2024-01-02 11:49:01
【问题描述】:

但是,当我尝试运行测试方法时,我可以成功部署和运行项目。我遇到了这个常见错误

org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [AutomatedTellerMachine] with qualifiers [@Named] at injection point [[field] @Named @Inject private advocacy.TestExample.automatedTellerMachine]
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:274)
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:243)
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:106)
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:126)
    at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:345)
    at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:330)
..
..

我也从这里阅读了类似的问题,但没有任何帮助。我从这里cdi-tutorial 阅读了一些关于依赖注入的 helloword 示例,之后我开始阅读 arquillian-tutorial

AutomatedTellerMachine.java

package advocacy;

import java.math.BigDecimal;

public interface AutomatedTellerMachine {

    public void deposit(BigDecimal bd);
    public void withdraw(BigDecimal bd);
}

AutomatedTellerMachineImpl.java

package advocacy;

import javax.inject.Inject;
import javax.inject.Named;
import java.math.BigDecimal;

@Named("atm")
public class AutomatedTellerMachineImpl implements AutomatedTellerMachine {

    @Inject
    @Named("jsonRestAtmTransport")
    private ATMTransport atmTransport;

    ...
}

而我的测试方法是这样的;

TestExample.java

package advocacy;

imports..

@RunWith(Arquillian.class)
public class TestExample {

    @Inject
    @Named("atm")
    private AutomatedTellerMachine automatedTellerMachine;

    @Deployment
    public static WebArchive createTestArchive() {
        return ShrinkWrap.create(WebArchive.class, "dependecy-injection.war")
                .addClasses(AutomatedTellerMachine.class)
                .addAsManifestResource(EmptyAsset.INSTANCE, "META-INF/beans.xml");
    }


    @Test
    public void test() {
        automatedTellerMachine.deposit(new BigDecimal(12.99));
    }
}

我的 beans.xml 在src/main/resources/META-INF/beans.xml

终于可以看到我的pom.xml文件here

【问题讨论】:

    标签: jakarta-ee dependency-injection cdi jboss-arquillian wildfly-8


    【解决方案1】:

    您应该将AutomatedTellerMachineImpl.class 添加到ShrinkWrap,如下所示:

    @Deployment
    public static WebArchive createTestArchive() {
        return ShrinkWrap.create(WebArchive.class, "dependecy-injection.war")
                .addClasses(AutomatedTellerMachine.class)
                .addClasses(AutomatedTellerMachineImpl.class)
                .addAsManifestResource(EmptyAsset.INSTANCE, "META-INF/beans.xml");
    }
    

    实际上最好直接添加一个包,这样你就不会一直错过一些东西。

    【讨论】:

      最近更新 更多