Как использовать OmniFaces 1.6 в двух WAR в одном EAR?

JBoss 7.1, OmniFaces 1.6, Eclipse Kepler, CDI 1.0

Я обнаружил следующую ситуацию с новыми Omnifaces 1.6, когда обновлял OmniFaces 1.5 до OmniFaces 1.6. Я предполагаю, что это как-то связано с новыми интересными функциями CDI OmniFaces 1.6.

У меня есть два проекта WAR на основе JSF в одном архиве EAR, оба проекта имеют OmniFaces в качестве зависимости, и они оба будут развернуты. При развертывании OmniFaces 1.6 попадает в /WEB-INF/lib обоих проектов WAR. При запуске JBoss выбрасывался IllegalArgumentException.

java.lang.IllegalArgumentException: Registering converter 'class org.omnifaces.converter.ListConverter' failed, duplicates converter ID 'omnifaces.ListConverter' of other converter 'class org.omnifaces.converter.ListConverter'.
    at org.omnifaces.cdi.converter.ConverterExtension.processConverters(ConverterExtension.java:78)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.jboss.weld.util.reflection.SecureReflections$13.work(SecureReflections.java:264)
    at org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:52)
    at org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInvocation(SecureReflectionAccess.java:137)
    at org.jboss.weld.util.reflection.SecureReflections.invoke(SecureReflections.java:260)
    at org.jboss.weld.introspector.jlr.WeldMethodImpl.invokeOnInstance(WeldMethodImpl.java:170)
    at org.jboss.weld.introspector.ForwardingWeldMethod.invokeOnInstance(ForwardingWeldMethod.java:51)
    at org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:154)
    at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:241)
    at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:229)
    at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:207)
    at org.jboss.weld.manager.BeanManagerImpl.notifyObservers(BeanManagerImpl.java:569)
    at org.jboss.weld.manager.BeanManagerImpl.fireEvent(BeanManagerImpl.java:559)
    at org.jboss.weld.bootstrap.events.AbstractContainerEvent.fire(AbstractContainerEvent.java:60)
    at org.jboss.weld.bootstrap.events.AbstractDefinitionContainerEvent.fire(AbstractDefinitionContainerEvent.java:38)
    at org.jboss.weld.bootstrap.events.ProcessManagedBeanImpl.fire(ProcessManagedBeanImpl.java:30)
    at org.jboss.weld.bootstrap.AbstractBeanDeployer.deploy(AbstractBeanDeployer.java:123)
    at org.jboss.weld.bootstrap.BeanDeployment.deployBeans(BeanDeployment.java:204)
    at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:344)
    at org.jboss.as.weld.WeldContainer.start(WeldContainer.java:82)
    at org.jboss.as.weld.services.WeldService.start(WeldService.java:76)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:662)

Если я удалю один проект WAR, то исключение исчезнет, ​​и я смогу использовать другой проект WAR в EAR.

Можно ли использовать OmniFaces 1.6 в нескольких проектах и ​​развернуть JBoss 7.1.1 в одном EAR?


person Tony    schedule 25.09.2013    source источник
comment
Эта проблема уже выявлена, и в настоящее время мы работаем над ней: код. google.com/p/omnifaces/issues/detail?id=251 Сегодня или завтра выйдет версия 1.6.1 с обязательными исправлениями.   -  person BalusC    schedule 25.09.2013
comment
Спасибо, буду ждать исправления!   -  person Tony    schedule 25.09.2013
comment
Я починил это. Пожалуйста, попробуйте снимок 1.6.1: oss. sonatype.org/content/repositories/snapshots/org/omnifaces/ Если это сработает для вас, я опубликую ответ с объяснением.   -  person BalusC    schedule 25.09.2013
comment
Извините, это еще не полностью исправлено. Я посмотрю на это.   -  person BalusC    schedule 25.09.2013
comment
Теперь проблема развертывания и проблема конвертера/валидатора устранена с текущим моментальным снимком, но @ViewScoped не работает так, как задумано в этой конструкции EAR+2WAR. Я смотрю на это.   -  person BalusC    schedule 25.09.2013
comment
Спасибо, проверю снапшот, но для дальнейшего развития жду оба исправления CDI (Viewscoped и конвертер/валидатор) в OmniFaces.   -  person Tony    schedule 26.09.2013


Ответы (1)


Эта ошибка была исправлена ​​в версии 1.6.1. За этой ошибкой стоит целая история, поэтому я написал об этом в блоге: CDI неожиданно повел себя в EAR, поэтому OmniFaces 1.6.1 выпущен!

Подводя итог: контекст CDI распространяется не на весь WAR, а на весь EAR. Что касается конкретного исключения, с которым вы столкнулись, это связано с тем, что из одного WAR загружался только один CDI ConverterExtension, который затем применялся для всего EAR и, таким образом, обрабатывал все @FacesConverter классы из обоих WAR вместо WAR, в котором Расширение CDI загружалось из.

Обратите внимание, что это не проблема в OmniFaces. Это проблема в том, как CDI работает в EAR.


Обновление: согласно проблеме WELD-2143 эта специфическая проблема наконец, исправлено в Weld 2.3.5. Я протестировал его в исправленном WildFly 10.0.0 и подтвердил, что все функции CDI OmniFaces, которые зависят от Extension, @ViewScoped, @Eager и @Param, снова работают в обоих WAR в одном EAR.

Итак, если вам сложно использовать вышеупомянутые функции CDI OmniFaces в EAR с несколькими WAR, убедитесь, что вы обновили Weld как минимум до версии 2.3.5. Проблема остается открытой в OpenWebBeans.

person BalusC    schedule 07.10.2013
comment
Спасибо за быстрый ответ и исправление ошибок! К сожалению пока не могу пользоваться 1.6.1. См. stackoverflow.com/questions/ 19247876/ - person Tony; 08.10.2013