Ton*_*ony 5 ear jsf cdi jsf-2 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最终进入/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)
Run Code Online (Sandbox Code Playgroud)
如果我删除一个WAR项目,那么异常消失,我可以在EAR中使用另一个WAR项目.
是否可以将OmniFaces 1.6作为一个项目使用,并在一个EAR中部署到JBoss 7.1.1?
该错误已在 1.6.1 中修复。这个错误背后有一个相当多的故事,所以我刚刚写了一篇博客:CDI 在 EAR 中表现异常,所以 OmniFaces 1.6.1 发布了!
总结:CDI 上下文不是 WAR 范围的,而是 EAR 范围的。至于您遇到的特定异常,这是因为只有一个 CDIConverterExtension从一个 WAR 中加载,然后在 EAR 范围内应用,从而处理两个@FacesConverterWAR中的所有类,而不是从加载 CDI 扩展的 WAR 中处理所有类。
请注意,这在 OmniFaces 中不是问题。这是 CDI 在 EAR 中工作方式的问题。
更新:根据问题WELD-2143,这个特殊问题最终在 Weld 2.3.5 中得到修复。我已经在打过补丁的 WildFly 10.0.0 中对其进行了测试,并确认所有依赖于Extension、@ViewScoped和@Eager的OmniFaces CDI 功能@Param在单个 EAR 的两个 WAR 中再次工作。
因此,如果您在具有多个 WAR 的 EAR 中使用上述 OmniFaces CDI 功能时遇到困难,请确保将 Weld 至少升级到版本 2.3.5。该问题在 OpenWebBeans 中仍然存在。
| 归档时间: |
|
| 查看次数: |
339 次 |
| 最近记录: |