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

标签 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 最终在 /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)

如果我删除一个 WAR 项目,那么异常就会消失,我可以在 EAR 中使用另一个 WAR 项目。

是否可以在多个项目中使用 OmniFaces 1.6,并在一个 EAR 中部署到 JBoss 7.1.1?

最佳答案

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

总结:CDI 上下文不是 WAR 范围的,而是 EAR 范围的。至于您遇到的特殊异常(exception),那是因为只有一个 CDI ConverterExtension从一个 WAR 加载,然后在整个 EAR 范围内应用,从而处理所有 @FacesConverter来自 的类(class)两者 WARs 而不是从中加载 CDI 扩展的 WAR。

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

更新 :根据问题WELD-2143这个奇怪的问题终于在 Weld 2.3.5 中得到解决。我已经在修补的 WildFly 10.0.0 中对其进行了测试,并确认所有依赖于 Extension 的 OmniFaces CDI 功能, @ViewScoped , @Eager@Param在单个 EAR 中的两个 WAR 中再次工作。

因此,如果您难以在具有多个 WAR 的 EAR 中使用上述 OmniFaces CDI 功能,请确保将 Weld 升级到至少 2.3.5 版。该问题在 OpenWebBeans 中仍然存在。

关于jsf - 如何在一个 EAR 中的两个 WAR 中使用 OmniFaces 1.6?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19003781/

相关文章:

cdi - 从@PreDestroy 方法调用@RequestScoped Bean

jsf - 如何将 SelectManyCheckbox 与两个 ArrayList 一起使用? - Primefaces

jsf - Mojarra session 中的服务器状态序列化

jakarta-ee - 使用 Java EE 6 将 EJB 注入(inject)域对象

java - 如何对数据表中的列进行排序。 JSF 2.0

java - 减少 If 语句中的代码重复

手动实例化bean时的CDI注入(inject)

jsf - ui 中条件渲染子类出现 PropertyNotFoundException :repeat

java - 在 EJB JSF 的一个 session 中存储同步版本的实体

jsf - 树的每个节点上的不同上下文菜单