使用CDI在运行时创建参数化对象

时间:2018-07-26 11:59:08

标签: java cdi weld producer

该项目使用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);
}

从我的研究人员的角度来看,方法不支持运行时参数。那么如何将这两个部分结合在一起?

1 个答案:

答案 0 :(得分:0)

首先,这是一个误解,即必须通过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;
}