2017-04-08 5 views
0

저는 CDI를 처음 사용하고 있으며 설명하기가 어렵지만 한 번 시도해 볼 수있는 문제가 있습니다.CDI 중첩 된 생산자 문제

public class MyBean { 
    private RequestData dataHolder; 

    @Produces 
    @RequestScoped 
    public RequestData getData() { 
    return dataHolder; 
    } 
} 

나는이 프로듀서 CDI 것을 알고 인스턴스 "삶"을 생산 : 여기처럼 RequestData라는 클래스의 인스턴스 (예를 들어 그 의사 코드) 범위 요청을 생성하는 CDI 생산을하고 싶습니다 (요청이 지속되는 한 요청을 싱글 톤 인스턴스 thingy로 요청할 수 있습니다.)

이제 RequestData 클래스에 더 많은 cdi 제작자가 포함되도록하고 싶습니다. 이 예 (다시 자바 의사 코드)에서와 마찬가지로 :

public class RequestData { 
private Something1 param1; 
private Something2 param2; 
... 

@Produces 
public Something1 getParam1(){ 
    return param1; 
} 

@Produces 
public Something2 getParam2(){ 
    ... 
} 
} 

내 문제의 마지막 질문은 내가 PARAM1 및 PARAM2 강제 할 수 있습니다 (에서 myBean에 요청 싱글 인스턴스에서 어떤 자바 코드/주석을 생산하는 방법이다 또는 무엇이 필요합니까?)

요약하면 MyBean은 RequestData를 생성하고 RequestData는 전체 요청 시간 동안 생존하고 더 나아가 param1, param2를 생성합니다. 여기

클래스 주입 PARAM1

public class Stuff{ 

@Inject 
public void startup(Something1 param1){ 
// param1 shall come from MyBean.getData().getParam1() 
} 
} 

어떤 아이디어를 몇 가지 예를 들어 어떻게을 실현하려? cdi 엔진에서 param1에 대한 MyBean.getData(). getParam1()을 수행하는 방법은 무엇입니까?

답변

0

이것은 잘못된 접근 방법입니다. CDI는 매우 강력한 주입 프레임 워크입니다. 주사에 사용하는 방법은 당신이 그것을 얼마나 많이 이해 했느냐에 달려 있습니다.

@ApplicationScoped //No need to be request scope, CDI is quite smart 
public class RequestContextProvider { 

    @Inject 
    private HttpServletRequest servletRequest; 

    @Produces 
    @Dependent //Make dependent if it can be null, if you are sure it cannot be, just declare it as RequestScoped 
    public SomethingData createSomethingData(InjectionPoint ip) { 
     String requestParam = servletRequest.getParameter("something-data"); 
     if(requestParam == null) { 
      return null; 
     } 

     return initSomethingData(requestParam); 
    } 

} 

사용법은 다음과 같이 보일 것입니다 :

@RequestScoped //Or whichever scope 
public class StuffService { 

    @Inject 
    private Instance<SomethingData> somethingData; 

    public void doStuff() { 
     //You need to take care here, that the somethingData.get() may return null 
     somethingData.get().soSomething(); 
    } 
} 
+0

안녕이 내가 요구하지만하지 않습니다이 경우를 들어

, 다음과 같이 Instance 게으른 주사를 사용하는 것이 훨씬 더 쉽다 나는 그것을 좋아한다. 제 요구 사항에 따라 제 질문을 풀어 주시겠습니까? – Ckkn

+0

하나, 나는 당신이 그것을 해결하려는 방식으로 당신의 문제를 해결 wouldnt. param1과 param2를 만들려면 다음과 같이'RequestData'에 의존해야합니다 : '''@Produces @RequestScoped public Something1 produce (RequestData rd) ''' – maress