У меня есть 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:
Согласно http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#d0e1443 , если фасоль не имеет область видимости @Dependent по умолчанию, контейнер должен непрямым все впрыскивается ссылки на боб через прокси-объект.
Согласно //openejb.979440.n4.nabble.com/RequestScoped-CDI-constructor-td4661541.html ИПР контейнер будет вызывать @Inject аннотированный конструктор для вашего боба, но будет использовать конструктор по умолчанию для создания прокси. Поэтому конструктор по умолчанию необходим для всех компонентов «NormalScoped» (@RequestScoped @SessionScoped @ApplicationScoped @ConversationScoped), потому что они всегда будут проксироваться.
Если компонент использует перехватчик, в соответствии с сообщением об ошибке, OpenWebBean использует прокси для взаимодействия с перехватчиком, поэтому перехваченные классы должны иметь конструкцию по умолчанию. Но Weld использует подклассы для перехватчиков и декораторов. https://issues.jboss.org/browse/WELD-437?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel Решение подкласса превосходит проксификации, поскольку оно позволяет избежать ряда проблем, таких как: перехваченные классы без конструктора без аргументов и доступ к полям на проксифицированных экземплярах. Итак, если я использую Tomee и Websphere, ему нужен стандартный ct, но GlassFish этого не делает.
Спасибо, брендиц, это мой первый вопрос здесь. Спасибо за помощь. И, кажется, я не могу ответить на свой вопрос и опубликовать более двух ссылок без 10 репутации, поэтому я редактировал здесь.
Что касается вопроса в заголовке, я опубликовал [ответ] (http: // stackoverflow.com/questions/7583871/injecting-a-named-string-using-cdi/7584762 # 7584762), которые могут быть полезны. – brandizzi
Кстати, когда вы добавляете конструктор по умолчанию, вы удаляете вложенный конструктор? – brandizzi
Я не удаляю инжектируемый конструктор. – user2211527