代码之家  ›  专栏  ›  技术社区  ›  john

可以抑制豆子注射吗?

  •  2
  • john  · 技术社区  · 7 年前

    我有一个网络应用程序要部署在WildFly 12上。应用程序中包含第三方JAR,代码与以下类似

    class X
    {
        @Inject private Y y = null;
    
        public void someMethod()
        {
            if (y == null)
                doSomething();
            else
                doSomethingElse(y);
        }
    }
    

    很明显,代码是在注入可能失败的假设下编写的,并且 y 可以是 null .

    但是Weld不喜欢这样,我得到了一个部署错误,它说 Y . 我不能修改第三方代码,也不想为提供依赖项 Y . 我想要 doSomething() 要采取的分支。

    有没有可能告诉Weld不要尝试在这个注入点注入任何东西?

    谢谢。

    2 回复  |  直到 7 年前
        1
  •  2
  •   StuPointerException    7 年前

    可能是杀伤力过大,但您可以创建一个 producer 总会回来的 null 为此 class :

    @ApplicationScoped
    public class YProducer {
    
        @Produces
        @RequestScoped  
        public Y create() {
            return null;
        }
    
        public void destroy(@Disposes Y y) {
            //no-op
        }
    }
    
        2
  •  0
  •   TacheDeChoco    7 年前

    我认为有更优雅的解决方案(在java8中)可以利用新的 Optional 班级:

    @Inject
    private Optional<Y> y;
    

    最大的区别是Y永远不会是空的! 然后你可以用这种方式简单地测试它的存在:

    if ( y.isPresent() ) {
       doSomethingElse(y);      
    } else {
       doSomething();
    }
    

    其他可能使用 javax.enterprise.inject.Instance

    @Inject
    private Instance<Y> instance;
    
    try {
       y = instance.get();
    } catch (Exception e) {
    }
    
    推荐文章