如何在一个EAR中的两个WAR中使用OmniFaces 1.6?

时间:2013-09-25 11:33:51

标签: jsf jsf-2 cdi ear omnifaces

JBoss 7.1,OmniFaces 1.6,Eclipse Kepler,CDI 1.0

当我从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?

1 个答案:

答案 0 :(得分:3)

此错误已在1.6.1中修复。这个错误背后有一个很简单的故事,所以我刚写了一篇博客:CDI behaved unexpectedly in EAR, so OmniFaces 1.6.1 released!

总结:CDI上下文不是WAR范围,而是EAR范围。至于你遇到的特殊例外情况,因为只有一个CDI ConverterExtension从一个WAR加载,然后在EAR范围内应用,从而处理来自的所有@FacesConverter个类两者 WAR而不是加载CDI扩展名的WAR。

请注意,这不是OmniFaces中的问题。这是CDI在EAR中工作方式的一个问题。


更新:根据问题WELD-2143,这个特殊问题最终已在Weld 2.3.5中得到修复。我在修补过的WildFly 10.0.0中对它进行了测试,并确认所有依赖于Extension@ViewScoped@Eager@Param的OmniFaces CDI功能都在单个EAR中的WAR。

因此,如果您在使用多个WAR的EAR中使用上述OmniFaces CDI功能时遇到困难,请确保将Weld升级到至少2.3.5版。这个问题在OpenWebBeans中仍未解决。