2013-03-26 3 views
3

У меня есть CDI bean, и перехватчик добавляется к одному из методов этого компонента. Если этот компонент не имеет конструктора по умолчанию (я использую Injection конструктора). Во время выполнения я получаю исключениеДолжен ли 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. В этом случае (с перехватчиком) будет ли контейнер создавать экземпляр дважды?

Edit: Я использую Tomee1.5 и WebShpere8.5 такой же, как Tomee1.5 и кажется, что GlassFish3.1.2 не имеет этой проблемы.

Edit: я нашел ответ в Tomee User Forum, который Контейнер CDI будет вызывать @Inject аннотированный каратов для вашего боба, но будет использовать каратов по умолчанию для создания прокси. Итак, я думаю, что это означает, что если вы хотите использовать инсталляцию конструктора, вам также нужен конструктор по умолчанию для проксибеции.

Edit:

  1. Согласно http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#d0e1443 , если фасоль не имеет область видимости @Dependent по умолчанию, контейнер должен непрямым все впрыскивается ссылки на боб через прокси-объект.

  2. Согласно //openejb.979440.n4.nabble.com/RequestScoped-CDI-constructor-td4661541.html ИПР контейнер будет вызывать @Inject аннотированный конструктор для вашего боба, но будет использовать конструктор по умолчанию для создания прокси. Поэтому конструктор по умолчанию необходим для всех компонентов «NormalScoped» (@RequestScoped @SessionScoped @ApplicationScoped @ConversationScoped), потому что они всегда будут проксироваться.

  3. Если компонент использует перехватчик, в соответствии с сообщением об ошибке, OpenWebBean использует прокси для взаимодействия с перехватчиком, поэтому перехваченные классы должны иметь конструкцию по умолчанию. Но Weld использует подклассы для перехватчиков и декораторов. https://issues.jboss.org/browse/WELD-437?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel Решение подкласса превосходит проксификации, поскольку оно позволяет избежать ряда проблем, таких как: перехваченные классы без конструктора без аргументов и доступ к полям на проксифицированных экземплярах. Итак, если я использую Tomee и Websphere, ему нужен стандартный ct, но GlassFish этого не делает.

    Спасибо, брендиц, это мой первый вопрос здесь. Спасибо за помощь. И, кажется, я не могу ответить на свой вопрос и опубликовать более двух ссылок без 10 репутации, поэтому я редактировал здесь.

+0

Что касается вопроса в заголовке, я опубликовал [ответ] (http: // stackoverflow.com/questions/7583871/injecting-a-named-string-using-cdi/7584762 # 7584762), которые могут быть полезны. – brandizzi

+0

Кстати, когда вы добавляете конструктор по умолчанию, вы удаляете вложенный конструктор? – brandizzi

+0

Я не удаляю инжектируемый конструктор. – user2211527

ответ

0

Как указано в CDI specification, боб CDI, который имеет связанный перехватчик должен быть proxyable, как это определено в unproxyable bean types, в котором говорится, кроме того, что proxyble бобы являются классы, которые имеют не-закрытый конструктор без параметров.