【问题标题】:Create parameterized objects at runtime with CDI使用 CDI 在运行时创建参数化对象
【发布时间】:2019-01-03 10:04:56
【问题描述】:

项目使用 CDI 2.0(特别是 Weld 3.0.4)设置。 现在我想让服务访问和缓存外部 REST 接口。

为了简单起见,我们假设这个 REST 接口返回给定数字标识符的 Json 对象,用 Java 说:service.getProduct(int productKey)

编写此类服务的“CDI 方式”是什么,特别是Product 对象(由服务返回)的范围和实例化?

(不完整)伪代码:

public class ProductService {
    public Product getProduct(int productKey) {
        String json = rest.get(productKey);
        return new Product(json);
    }
}

...

@Produces
public Product create(int productKey) {
    return new Product(productKey);
}

根据我的研究生产者方法不支持运行时参数。那么如何将这两个部分结合起来呢?

【问题讨论】:

    标签: java cdi weld producer


    【解决方案1】:

    首先,这是一个误解,即 CDI 容器中的每个对象都必须通过 CDI 创建。 CDI 托管 bean 通常是服务,而不是根本不需要注入的简单数据对象。

    因此,如果您的 Product 类不需要与服务交互,只需使用您可以注入和使用的普通工厂。

    如果您确实需要多个完全支持 CDI 的产品实例,一种常见的方法是将实际参数化移动到单独的方法中,例如

    public class Product {
        // the reason to use CDI in Product:
        @Inject SomeService myService;
    
        // Normal "data object" properties
        private String productId;
        private String procuctName;
    
        public void init(...) {
           this.productId = ...
           this.productName = ...
        }
    }
    

    在调用者中:

    @Inject Provider<Product> productFactory;
    
    public Product getProduct(int productKey) {
        String json = rest.get(productKey);
        Product result = productFactory.get();
        result.init(json);
        return result;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 2015-03-09
      相关资源
      最近更新 更多