2011-01-12 4 views
4

현재 범위에서 사용할 수있는 경우에만 필드를 삽입해야하며 그렇지 않으면 null입니다. 예를 들면 :선택 Guice의 스코프 삽입

public class Thinger implements Provider<SomeSuch> { 
    public @Inject(optional=true) HttpServletRequest request;   

    public SomeSuch get() { 
     return request == null ? new WhosIt() : WhatsIt(); 
    } 
} 

그러나, HttpServletRequest의은 행 (이것은이다)하지만 범위에, 나는 ProvisioningException을받을 경우. 나는 이것을하기위한 우아한 방법을 찾을 수 있었고 그래서 나는 어떤 일을하도록 강등되었다.

HttpServletRequest request = null; 
try { 
    request = injector.getInstance(HttpServletRequest.class); 
} catch(ProvisioningException e) {} 

이는 모든 방식이 잘못되었다고 느낍니다. 이것을 할 수있는 적절한 방법이 있습니까?

답변

3

클래스를 정확히 사용할 수있는 것은 무엇입니까? HttpServletRequest는 나에게 어긋나지 만, 요청 범위가 아닌 서비스 내에서 요청을받지 못하는 것은 나에게 오류처럼 들릴 수 있기 때문에.

하나의 아이디어는 일반적으로 get/set 메서드를 사용하여 Holder 용 사용자 지정 공급자를 작성하는 것입니다. 공급자에서는 현재 범위에서 사용할 수 있는지 여부에 관계없이 검사를 실행할 수 있지만 항상 필요한 유형의 소유자를 반환하지만 사용할 수있는 대상에 따라 비어 있거나 null 일 수 있습니다. 항상 홀더를 반환하기 때문에 인젝터가 잘 작동합니다. 이것을 주입하려는 구성 요소에서 null을 확인하기 만하면됩니다.

희망이 도움이됩니다.

+0

우리는 "범위 안에"있는지 어떻게 확인할 수 있습니까? – BrunoJCM