【问题标题】:Weld @Produces dependency has null injection pointWeld @Produces 依赖项具有空注入点
【发布时间】:2018-06-01 18:30:01
【问题描述】:

我有一个带有非默认构造函数的通用 DAO,看起来像这样(实际上与车辆无关,我只是想提供一个简单的示例)

public class GenericVehicleDao<T extends Vehicle> {
    private Class<T> clazz;

    @Inject
    private DaoHelper daoHelper;

    public GenericDao(Class<T> clazz)
    {
        this.clazz = clazz;
    }
}

我有另一个类,其中包含一些使用此构造函数的 @Produces 方法,例如

public class AppProducer {

    @Produces
    public GenericDao<Car> createCar() {
        return new GenericDao(Car.class);
    }

    @Produces
    public GenericDao<Truck> createTruck() {
        return new GenericDao(Truck.class);
    }

}

然后我可以将该 DAO 注入到服务层,例如。

@Stateless
public class VehicleService {

    @Inject
    private GenericVehicleDao<Car> carDao;

}

Car DAO 可以很好地注入服务层,但是我发现在构建 DAO 后,注入的 DAO DaoHelper 为空。如果我将 DaoHelper 注入到服务层然后注入很好,但是我宁愿在 DAO 本身中进行注入。我曾尝试从字段注入切换到 setter 注入,但我遇到了同样的问题。

【问题讨论】:

    标签: jakarta-ee dependency-injection cdi jboss-weld


    【解决方案1】:

    再次回答我自己的问题,这可能对其他人有用。经过一番谷歌搜索后,我在Weld documentation

    中发现了以下内容

    上面的代码存在一个潜在问题。实施 CreditCardPaymentStrategy 使用 Java new 实例化 操作员。应用程序直接实例化的对象不能取 依赖注入的优势并且没有拦截器。

    如果这不是我们想要的,我们可以使用依赖注入到 获取bean实例的producer方法:

    这意味着我可以将我的 Producer 方法更改为采用以下格式,然后它就可以正常工作了

    @Produces
    public GenericDao<Car> createCar(DaoHelper helper) {
        GenericDao<Car> carDao = new GenericDao<>(Car.class);
        carDao.setHelper(helper);
        return carDao;
    }
    

    【讨论】:

    • 只是一个确认-这是正确的,当您自己处理对象创建时,不会自动注入任何字段。有很多方法可以实现这一点,例如将其设为InjectionTarget,但您所做的是最简单且首选的方法。还为实际阅读文档 +1 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    相关资源
    最近更新 更多