2017-12-19 5 views
0

내가용접 @Produces 의존성이 null 주입 지점

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

    @Inject 
    private DaoHelper daoHelper; 

    public GenericDao(Class<T> clazz) 
    { 
     this.clazz = clazz; 
    } 
} 
(난 그냥 간단한 예를 제공하기 위해 노력하고있어 차량과는 실제로)이 같이 보입니다 아닌 기본 생성자와 함께 일반 DAO를 가지고있다

은 난 후 서비스 계층 예에 해당 DAO를 주입 할 수

public class AppProducer { 

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

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

} 

위해 그래서 생성자를 사용하여 일부 @Produces 방법과 다른 클래스가있다. DAO를가 건설 된 후 자동차 DAO 그러나 나는 DAO의이 DaoHelper 주입 것을 찾는거야, 서비스 계층에 미세 주입

@Stateless 
public class VehicleService { 

    @Inject 
    private GenericVehicleDao<Car> carDao; 

} 

은 null입니다. DaoHelper를 서비스 레이어에 삽입하면 괜찮습니다. DAO 자체에서 주입하는 것이 좋습니다. 필드 주입에서 세터 주입으로 전환을 시도했지만 동일한 문제가 있습니다.

답변

0

내 자신의 질문에 다시 한번 대답하면 다른 사람들에게 유용 할 수 있습니다. Google 검색에서 더 많은 것을 찾았을 때 Weld documentation

위의 코드에 하나의 잠재적 인 문제가 있습니다. CreditCardPaymentStrategy의 구현 은 Java 새 연산자를 사용하여 인스턴스화됩니다. 응용 프로그램에서 직접 인스턴스화 한 객체는 종속성 주입의 이점을 취할 수 없으며 인터셉터가 없습니다.

이없는 우리가 원하는 경우, 우리는 빈 인스턴스 얻기 위해 생산자 방식으로 의존성 주입을 사용할 수 있습니다 이것이 내가 다음과 같은 형식을 내 생산자 방식을 변경할 수 있으며 의미

을 괜찮 으면 작동합니다.

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

확인 -이 기능은 사용자가 직접 개체를 처리 할 때 자동으로 입력 할 수있는 필드가 아닙니다. 'InjectionTarget '을 만드는 등의 목표를 달성 할 수있는 방법이 있지만 가장 쉬운 방법은 바로 당신입니다. 또한 실제로 문서를 읽으려면 +1 :) – Siliarus

관련 문제