2013-09-25 8 views
5

JBoss 7.1, OmniFaces 1.6, Eclipse 케플러, CDI 1.0하나의 EAR에서 두 WAR로 OmniFaces 1.6을 사용하는 방법은 무엇입니까?

OmniFaces 1.5에서 OmniFaces 1.6으로 업데이트 할 때 새로운 Omnifaces 1.6에서 다음 상황을 발견했습니다. 필자는 OmniFaces 1.6의 새로운 흥미로운 CDI 기능과 관련이 있다고 가정합니다.

하나의 EAR 아카이브에 두 개의 JSF 기반 WAR 프로젝트가 있고 두 프로젝트 모두 종속성으로 OmniFaces가 있으며 둘 다 배치됩니다. 배포시 OmniFaces 1.6은 두 가지 WAR 프로젝트 중 /WEB-INF/lib으로 끝납니다. 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 프로젝트를 제거하면 예외가 사라지고 EAR에서 다른 WAR 프로젝트를 사용할 수 있습니다.

하나의 프로젝트에서 OmniFaces 1.6을 사용할 수 있습니까? 하나의 EAR에 JBoss 7.1.1에 배포 할 수 있습니까?

+2

이 문제는 이미 확인되었으며 현재 해결 중입니다. https://code.google.com/p/omnifaces/issues/detail?id=251 오늘 또는 내일에는 1.6.1이 필수 수정 사항. – BalusC

+0

고맙습니다. 고쳐질 때까지 기다리고 있습니다! – Tony

+1

나는 그것을 고쳤다. 1.6.1 스냅 샷을 시도해보십시오. https://oss.sonatype.org/content/repositories/snapshots/org/omnifaces/omnifaces/1.6.1-SNAPSHOT/ 문제가 해결되면 답변과 함께 설명을 게시합니다. – BalusC

답변

3

이 버그는 1.6.1에서 수정되었습니다. 이 버그에 대한 이야기가 있습니다. 따라서 블로그를 작성했습니다 : CDI behaved unexpectedly in EAR, so OmniFaces 1.6.1 released!

요약 : CDI 컨텍스트는 전체 WAR가 아니지만 전체적으로는 아닙니다. CDI ConverterExtension이 하나의 WAR에서로드 된 다음 EAR 전체에 적용되므로 @FacesConverter 클래스를 모두 에서 처리합니다. CDI 확장이로드되는 WAR 대신 WAR가 아닌 WAR가 모두 처리됩니다. 에서.

OmniFaces에서는 문제가되지 않습니다. 이것은 EAR에서 CDI가 작동하는 방식에 문제가 있습니다.


업데이트는 : 문제 WELD-2143에 따라이 특유의 문제는 결국 용접 2.3.5에서 수정되었습니다. 나는 패치 된 WildFly 10.0.0에서 테스트를 마치고 Extension, @ViewScoped, @Eager@Param에 의존하는 모든 OmniFaces CDI 기능이 단일 EAR에서 두 WAR로 다시 작동한다는 것을 확인했습니다.

따라서 여러 WAR가있는 EAR에서 앞서 언급 한 OmniFaces CDI 기능을 사용하는 데 어려움이 있다면 Weld를 버전 2.3.5 이상으로 업그레이드해야합니다. 문제는 OpenWebBeans에서 열려 있습니다.

+0

빠른 응답과 버그 ​​수정을 가져 주셔서 감사합니다! 불행히도 1.6.1은 아직 사용할 수 없습니다. http://stackoverflow.com/questions/19247876/required-fields-with-omnifaces-1-6-1을 참조하십시오. – Tony