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?
答案 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中仍未解决。