【问题标题】:How to use OmniFaces 1.6 in two WARs in one EAR?如何在一个 EAR 的两个 WAR 中使用 OmniFaces 1.6?
【发布时间】:2013-09-30 23:28:11
【问题描述】:

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?

【问题讨论】:

  • 这个问题已经确定,我们目前正在解决这个问题:code.google.com/p/omnifaces/issues/detail?id=251 今天或明天会有一个 1.6.1 强制修复。
  • 谢谢,我会等待修复!
  • 我修好了。请尝试 1.6.1 快照:oss.sonatype.org/content/repositories/snapshots/org/omnifaces/… 如果它适合你,我会发布一个带有解释的答案。
  • 对不起,它还没有完全修复。我会看的。
  • 现在,部署问题和转换器/验证器问题已通过当前快照修复,但 @ViewScoped 在此 EAR+2WAR 构造中无法正常工作。我正在看。

标签: jsf jsf-2 cdi ear omnifaces


【解决方案1】:

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

总结:CDI 上下文不是 WAR 范围的,而是 EAR 范围的。至于您面临的特定异常,这是因为只有一个 CDI ConverterExtension 从一个 WAR 加载,然后在 EAR 范围内应用,因此处理来自 both WAR 的所有 @FacesConverter 类,而不是从中加载 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 中仍然存在。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2016-03-19
  • 2015-04-11
  • 1970-01-01
  • 2011-07-07
  • 2012-03-23
相关资源
最近更新 更多