2013-03-26 1 views
3

CDI 빈을 가지고 있으며,이 빈의 한 메소드에 인터셉터가 추가되었습니다. 이 빈에 기본 생성자가 없다면 (저는 생성자 삽입을 사용합니다). 나는이 콩의 기본 생성자를 추가하거나 인터셉터를 제거하는 경우 런타임에서, 나는 예외를인터셉터가있는 CDI 빈에 기본 생성자가 있어야합니까?

java.lang.Class.newInstance0(Class.java:357) 
java.lang.Class.newInstance(Class.java:325) 
org.apache.webbeans.proxy.javassist.JavassistFactory.createProxy(JavassistFactory.java:79) 
org.apache.webbeans.proxy.ProxyFactory.createProxy(ProxyFactory.java:241) 
org.apache.webbeans.proxy.ProxyFactory.createDependentScopedBeanProxy(ProxyFactory.java:412) 
org.apache.webbeans.component.AbstractInjectionTargetBean.createDefaultInstance(AbstractInjectionTargetBean.java:140) 
org.apache.webbeans.component.AbstractInjectionTargetBean.createInstance(AbstractInjectionTargetBean.java:116) 
org.apache.webbeans.component.AbstractOwbBean.createNewInstance(AbstractOwbBean.java:233) 
org.apache.webbeans.portable.creation.AbstractProducer.produce(AbstractProducer.java:77) 
org.apache.webbeans.component.InjectionTargetWrapper.produce(InjectionTargetWrapper.java:136) 

를 얻을이 확인 될 것입니다. 사실이 질문을 처리하기 위해 필드 주입을 사용할 수 있습니다.

하지만 기본 생성자를 추가하면이 빈에는 두 개의 생성자가 있다는 것을 알 수 있습니다. 하나는 매개 변수가 아닌 매개 변수이고 다른 하나는 @Inject 매개 변수입니다. 이 경우 (인터셉터를 사용하여) 컨테이너는 인스턴스를 두 번 만듭니다.

편집 : 내가 Tomee1.5을 사용하고 WebShpere8.5가 Tomee1.5 과 동일하고 GlassFish3.1.2이 문제가없는 것으로 보인다.

편집

: 나는 CDI 컨테이너가 빈의 @Inject 주석 CT를 호출하지만 프록시를 만들기위한 기본 CT를 사용하는 것입니다 Tomee 사용자 포럼에서 해답을 발견했다. 그래서, 나는 당신이 생성자 삽입을 사용하기를 원한다면, 또한 프록시 가능한 기본 생성자가 필요하다는 것을 의미한다고 생각한다.

편집 : 빈 기본 범위 @Dependent를 가지고 있지 않는 http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#d0e1443 에 따르면

  1. , 컨테이너는 모든 간접 프록시 객체를 통해 빈에 대한 참조를 주입해야합니다. //openejb.979440.n4.nabble.com/RequestScoped-CDI-constructor-td4661541.html 여러분의 빈에 대한 @Inject 주석 생성자를 호출하지만 만들기위한 기본 생성자를 사용합니다 CDI 컨테이너에 따르면

  2. 프록시들. 왜냐하면 항상 프록시되기 때문에 모든 'NormalScoped'(@RequestScoped @SessionScoped @ApplicationScoped @ConversationScoped) 빈에 대한 기본 생성자가 필요합니다.

  3. 오류 메시지에 따라 Bean이 인터셉터를 사용하는 경우 OpenWebBean은 프록시를 사용하여 인터셉터를 처리하므로 인터셉트 된 클래스는 기본 구문을 가져야합니다. 그러나 Weld는 인터셉터와 데코레이터에 하위 클래스를 사용합니다. https://issues.jboss.org/browse/WELD-437?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel 하위 클래 싱 솔루션은 프록 시화보다 우수합니다. 즉, 인수가없는 생성자가없는 가로채는 클래스와 프록시 화 된 인스턴스에서 필드 액세스와 같은 여러 문제를 처리하지 않기 때문입니다. Tomee와 Websphere를 사용하면 기본 ct가 필요하지만 GlassFish는 필요하지 않습니다.

    감사합니다. brandizzi, 여기 내 첫 번째 질문입니다. 도와 줘서 고마워. 그리고 나는 내 자신의 질문에 대답 할 수없고, 평판이없는 두 개의 링크 을 게시 할 수 없어서 여기에서 편집했습니다. CDI specification에 설명 된대로

+0

제목의 질문에 대해 [답변] (http : // stackoverflow.com/questions/7583871/injecting-a-named-string-using-cdi/7584762 # 7584762)이 유용 할 수 있습니다. – brandizzi

+0

BTW, 기본 생성자를 추가 할 때 삽입 된 생성자를 제거합니까? – brandizzi

+0

삽입 된 생성자를 제거하지 않습니다. – user2211527

답변

0

, proxyble 콩 매개 변수없이 비 개인 생성자가 클래스가 있음을 추가로 명시 unproxyable bean types에 정의 된대로, proxyable해야 바운드 인터셉터가있는 CDI 콩,.

관련 문제