焊接@Produces依赖项具有空注入点

问题描述 投票:0回答:1

我有一个非默认构造函数的泛型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本身进行注入。我尝试过从现场注射切换到二次注射,但我有同样的问题。

java-ee dependency-injection cdi jboss-weld
1个回答
0
投票

再次回答我自己的问题,这可能对其他人有用。经过一些谷歌搜索后,我在Weld documentation发现了以下内容

上面的代码存在一个潜在的问题。 CreditCardPaymentStrategy的实现使用Java new运算符进行实例化。由应用程序直接实例化的对象无法利用依赖注入,也没有拦截器。

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

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

@Produces
public GenericDao<Car> createCar(DaoHelper helper) {
    GenericDao<Car> carDao = new GenericDao<>(Car.class);
    carDao.setHelper(helper);
    return carDao;
}
© www.soinside.com 2019 - 2024. All rights reserved.