2011-08-20 4 views
0

드디어 Tomcat에서 Weld를 살펴보기로 결정했습니다. 내 응용 프로그램을 배포 할 때 나는 로그에서 볼 :서블릿 3.0 컨테이너의 CDI 주입 외부 필터 및 서블릿

예를 들어 필터 외부가 BeanManager를 사용하여 빈의 인스턴스를 만들 수있는 방법

"톰캣 7 감지, CDI 주입 서블릿과 필터에서 사용할 수 있습니다"/서블릿?

나는 콩이 :

@javax.inject.Named(value="CarService") 
@javax.enterprise.context.RequestScoped 
public class CarService implements Serializable{ 
. 
. 
. 

을 나는 지정된 요청 컨텍스트의가 BeanManager를 사용하여 인스턴스를 만들려고합니다. 이것은 서블릿/필터에서 수행 할 수있는 경우

Context ctx = new InitialContext(); 
BeanManager manager = (BeanManager) ctx.lookup("java:comp/env/BeanManager"); 
// NOW WHAT? 

는 내가 다른 곳에서는 할 수있는 확신하지만, 난 그냥 용접 코드를 통해 이동 먼저 요청하지 않고 자신을 파악하고 싶지 않아요.

대단히 감사합니다.

+0

나는 그것을 얻지 못했다. 너 뭐하려고? 어떤 클래스에서이 빈을 사용하고 싶습니까? – brandizzi

답변

2

BeanManager을 사용하면 거의 수행하지 않아도되는 작업입니다. 요점은 종속성이 필요한 곳 ​​(의존성 주입)에 @Inject을 사용하는 것입니다. 관리자를 사용하는 것은 "서비스 탐지기"패턴입니다.

정말 필요한 경우 manager.getBeans(yourDesiredClass)을 사용하고 세트에서 하나를 선택하고 manager.getReference(bean, theClass, ctx)으로 전화하십시오. ctx은 (는) manager.createCreationalContext(bean)

+0

도움을 주셔서 감사합니다! 이유는 BlazeDS에서 BeanManager를 사용하여 서비스 객체에 주입을 사용할 수 있기를 원했기 때문입니다. 그래서 이것이 실제로 필요하다고 생각합니다. manager.resolve (manager.getBeans (type)) 메소드는 권고대로 설정을 거치지 않고 bean을 해결합니다. – DaTroop

+0

aha. 플렉스 통합은 실제로 빈 관리자와의 상호 작용이 필요할 수도있는 장소처럼 보입니다. – Bozho

+0

Bozho 나는 어쨌든 대답을 주었다. 도와 주셔서 감사합니다! – DaTroop

2

으로 이미 내가 필요한 모든 것을 준이 Seam 코드를 사용했습니다.

public static <T> T getContextualInstance(final BeanManager manager, final Class<T> type) { 
     T result = null; 
     Bean<T> bean = (Bean<T>) manager.resolve(manager.getBeans(type)); 
     if (bean != null) { 
      CreationalContext<T> context = manager.createCreationalContext(bean); 
      if (context != null) { 
       result = (T) manager.getReference(bean, type, context); 
      } 
     } 
     return result; 
    } 
관련 문제