通用CDI生产者方法未按预期工作

波斯人:

我有一个CDI生产者方法-根据与本示例不相关的某些条件-创建不同类型的对象:

public class TestProducer {

  @Produces @TestQualifier
  public Object create(InjectionPoint ip) {
    if(something) {
      return "a String";
    } else {
      return Integer.valueOf(42);
    }
  }

但是使用此生产者时,在以下情况下我总是会出错:

@Named("test")
public class TestComponent {
   ...
   @Inject public void setA(@TestQualifier String stringValue) {
   ...
   @Inject public void setB(@TestQualifier Integer integerValue) {

仅当生产者的create方法的方法签名中具有预期的类型时,此方法才有效:

public class TestProducer {

  @Produces @SpringBean
  public String create(InjectionPoint ip) {

现在已经正确注入了String,但是我无法从生产者方法中生成整数。但这正是我要避免的事情,因为生产者本身应该是完全通用的。

我是在做错什么,还是没有办法实现我想要的行为?

brandizzi:

所有CDI文档都清楚地表明CDI确实进行了类型安全的依赖项注入-它是CDI的崇高属性。恕我直言,您要做的就是CDI要避免的事情。您希望容器转换Object为每种类型,而CDI不能那样工作。

注入指向stringValue并且integerValue只能接收在其bean类型列表中分别具有java.lang.Stringjava.lang.Integerbeanjava.lang.Object不满足此条件。

我有两个建议。首先,由于您有两个或多个不同类型的注入点,因此请为该类型创建两个或多个生成器方法:

public class TestProducer {

  @Produces @TestQualifier
  public String createString(InjectionPoint ip) {
    if(something) {
      return "a String";
    } else {
      // Some other value
    }
  }

  @Produces @TestQualifier
  public int createInt(InjectionPoint ip) {
    if(something) {
      return 42;
    } else {
      // Some other value
    }
  }
// ...

如果something条件仅是检查注射点的类型(我所打赌的情况),则它起作用

但是,如果something条件确实使用注入点的类型以外的其他条件来决定类型,我建议您自己做“肮脏的工作”:将返回的值注入到Object类型化的注入点中,并手动进行转换:

@Named("test")
public class TestComponent {
   ...
   @Inject public void setA(@TestQualifier Object value) {
       String stringValue = (String) value;

   ...
   @Inject public void setB(@TestQualifier Object value) {
       int intValue = (Integer) value;

要点是,与其他一些DI框架不同,CDI不能在Java类型系统上工作-相反,它大量使用它。不要尝试与之抗争,而是使用CDI的这一方面对您有利:)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么生产者没有继承CDI

春天卡夫卡生产者不工作异步

链接列表的addLast()方法未按预期工作

生产者方法与命名类

从EJB无状态会话Bean调用CDI会话范围内的生产者方法

CDI激活包装在瓶子中的生产者

CDI生产者未被合格者认可

GreenRobot:EventBus的isRegistered()方法未按预期工作

测量消费者/生产者工作的时间

CDI实例生产者

C ++ 11(或更高版本)中的通用多个生产者/消费者感到奇怪

cdi注入的依赖关系在生产者方法创建的bean中解析为null

生产者多消费者问题,消费者在生产者完成之前完成工作

带有消费者/生产者API的Kafka的Spring Cloud Stream恰好在带有transaction-id-prefix的语义无法按预期工作时

生产者和消费者未按顺序打印答案

我是否需要通过CDI中的生产者进行所有对象实例化

TurfJS沿方法未按预期工作

通用生产者和消费者

如果定义类未声明作用域,则CDI生产者方法不起作用

在CDI中将运行时(Meta)数据传递给生产者方法

是否可以使用CDI注入没有生产者方法的自定义JBoss模块?

多线程 Kafka 生产者如何工作?

通过生产者方法在类中注入 CDI Event<T>

whenComplete() 方法未按预期工作 - Flutter Async

多生产者和消费者多线程 Java 未按预期工作

Python:.strip() 方法未按预期工作

kafka-producer-network-thread 卡夫卡生产者不工作 生产者-1

为生产者和消费者创建通用(模板)调度程序

ngOnInit() 方法未按预期工作