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

未注入内部依赖项(Weld JavaSE)

栾鸣
2023-03-14

我正在通过添加CDI重构旧模块。

我以

public interface ApiFactory {
  ...
}

public class ApiFactorySp
    implements ApiFactory {
  @Inject
  UrlProducer urlProducer;  // <-- Does not get injected
  ...
}

public interface UrlProducer {
    public String getUrl();
}

@Alternative
public class UrlProducerTest
    implements UrlProducer {

    @Override
    public String getUrl() {
        return "https://myTestEnv.mydomain/myWebApp";
    }
 }

为了进行测试,我创建了一个bean。META-INF中的xml文件:

<beans
  xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
    http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
  bean-discovery-mode="all">
    <alternatives>
      <class>myOrg.myProject.myPackage.UrlProducerTest</class>
    </alternatives>
</beans>

为了测试它,我正在做这个博客中显示的

public class WeldContext {

    public static final WeldContext INSTANCE = new WeldContext();

    private final Weld weld;
    private final WeldContainer container;

    private WeldContext() {
        this.weld = new Weld();
        this.container = weld.initialize();
        Runtime.getRuntime().addShutdownHook(new Thread() {

            @Override
            public void run() {
                weld.shutdown();
            }
        });
    }

    public <T> T getBean(Class<T> type) {
        return container.instance().select(type).get();
    }
}

public class WeldJUnit4Runner extends BlockJUnit4ClassRunner {

    public WeldJUnit4Runner(Class<Object> clazz) throws InitializationError {
        super(clazz);
    }

    @Override
    protected Object createTest() {
        final Class<?> test = getTestClass().getJavaClass();
        return WeldContext.INSTANCE.getBean(test);
    }
}

现在,当我试图测试逻辑时,我做到了

@RunWith(WeldJUnit4Runner.class)
public class MyTest {
     @Inject
     UrlProducer urlProducer;         

     @Inject
     ApiFactory apiFactory;

     @Test
     public void test() {
         apiFactory.doSomethingThatRequiresUrlProducer();
     }
 }

当我运行它时,两个测试属性都是inject,但是我得到了NPE,因为apiFactory实例中的urlProducer属性没有被赋值。

为什么Weld不能识别ApiFactory中的@Inject属性?

JDK 7,焊接2.2.10,Junit 4.12

更新:发布问题后,开始尝试一个更简单、全新的项目(只有两个接口和三个类)。使用Weld“standalone”并不能解决这个问题,使用CDI单元确实解决了这个问题。

然后我修改了我原来的项目,使用CDI单元,但它没有改进任何东西。之后,我将ApiFactoryUrlProducerTest的注入从字段改为构造函数(即定义@injectapifactory(UrlProducer-UrlProducer)构造函数),解决了这个问题。我还没有用“独立”焊接(即明天的焊接)尝试过这种解决方案,但我仍然有兴趣知道为什么现场注入不起作用。

共有2个答案

雷飞虎
2023-03-14
匿名用户

因为ApiFactorySp不是CDI bean。您需要用@Named注释该类,以将该类标识为CDI bean,以便CDI执行依赖项注入。

魏旭
2023-03-14

如果UrlProducerTest是一个替代方案,并且您想要注入这个bean,那么应该将这个类添加到bean中。xml转换成

编辑:

我相信,如果某个bean不能被注入,你会收到“不满意/不明确的依赖项”消息<如果使用返回Null的CDIproducer方法,则可以注入code>Null,但这不是您的场景。

所以如果控制台没有错误,我有两个假设:

>

您在注入之前使用urlProducer。例如,从构造函数或初始化块(apiFactory.do不提供一些东西。所以将此逻辑移动到某个方法并通过@PostConf t注释它

 类似资料:
  • 问题内容: 尝试为模块设置一些辅助值。尝试了服务和价值,但没有帮助: 我做错了什么? 问题答案: 问题是您试图将值对象插入AngularJS模块的config块中,并且不允许这样做。您只能在config块中注入常量和提供程序。 AngularJS 文档(部分:“模块加载和依赖关系”)提供了有关以下方面的见解: 模块是配置和运行块的集合,这些块在引导过程中应用于应用程序。以最简单的形式,该模块包含两

  • 我正在尝试创建一个带有Wildfly和数据库连接的EJB Web项目,以持久化我的类“article”。但当我启动我的应用程序时,我得到了错误 包装服务; ArticleDaoImpl

  • 我有一个Spring启动应用程序,我最近从v1.3.3. RELEASE升级到v1.4.2. RELEASE。 用于我在v1中的集成测试。3.3,我有一个豆子,我能够成功地监视它。我在运行测试时,配置文件,下面的被激活,而不是应用程序的。 我正在升级到v1。4.2.发布并希望使用spyBean注释模拟单个方法,而不依赖于概要文件。 我对我的测试方法做了以下改变,以尝试它- 然而,当我尝试上述方法时

  • 我们在产品中使用Spring引导微服务,我们有多达10个应用程序。为了记录,我们使用Log4j MDC来生成事务标识,并使用拦截器和过滤器将其传递给服务[超文本传输协议标头]。问题是我们必须在我们所有的应用程序(比如10个)中添加拦截器和过滤器来跟踪这个事务。有没有办法在我们的微服务应用程序中创建jar并注入。 我们能否在所有应用程序中使用最少的代码更改来实现这一点?

  • 问题内容: 我想将依赖项注入。但是,我的方法不起作用。我可以看到Spring正在调用我的setter方法,但是稍后在调用when时,该属性为。 这是我的设置: ServletContextListener: web.xml :(这是文件中的最后一个侦听器) applicationContext.xml: 输出: 实现此目的的正确方法是什么? 问题答案: 我通过删除侦听器bean并为我的属性创建了一

  • 我想向Springbean注入一个单例对象依赖关系。问题是我无法访问和修改要注入其对象的类。让我描述一下这个例子。 所以我有我的接口,以及这个接口的实现,如下所示。 然后在我的配置类中,我正在创建一个bean,但是我需要在构造函数中向它传递对象,问题是我不能使成为bean,因为它来自外部包,我不能修改它。 所以我想做的是,能够将/autowire参数传递给bean。目前IntelliJ给我一个错误