java.lang.IllegalArgumentException:具有相同键的多个条目:接口 javax.validation.constraints.Min

java.lang.IllegalArgumentException: Multiple entries with same key: interface javax.validation.constraints.Min

我是 运行 一个 EJB + EJB + WAR 部署在 JBoss WildFly 8.2 中的 EAR。0.Final 使用 JSF 2.2 和 RichFaces 4.5。2.Final.我的问题是,所有 RichFaces 资源都无法在客户端正确加载。生成的 URL 无法解析并且 return 带有 HTTP 404。

部署基于 Maven 并产生以下结构:

在 EJB 模块中使用 <scope>compile</scope> 而不是 WAR 的原因是我需要从我的 EJB 模块中扩展 RichFaces 类。我们已经基于一些组件构建了一个动态表单生成器。

只要我在 WAR 模块中使用 <scope>compile</scope> 而不是 <scope>provided</scope> 将 JAR 添加到 EAR/lib/WAR/WEB-INF/lib/,我就会得到以下堆栈跟踪启动应用程序服务器时:

Caused by: java.lang.IllegalArgumentException: Multiple entries with same key: interface javax.validation.constraints.Min=org.richfaces.javascript.LibraryFunctionImplementation@c77af4e and interface javax.validation.constraints.Min=org.richfaces.javascript.LibraryFunctionImplementation@5a903150
    at com.google.common.collect.ImmutableMap.checkNoConflict(ImmutableMap.java:150)
    at com.google.common.collect.RegularImmutableMap.checkNoConflictInBucket(RegularImmutableMap.java:104)
    at com.google.common.collect.RegularImmutableMap.<init>(RegularImmutableMap.java:70)
    at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:254)
    at org.richfaces.javascript.ClientServiceConfigParser.parseConfig(ClientServiceConfigParser.java:75)
    at org.richfaces.application.ValidatorModule.createClientScriptService(ValidatorModule.java:65)
    at org.richfaces.application.ValidatorModule.configure(ValidatorModule.java:60)
    at org.richfaces.application.ServicesFactoryImpl.init(ServicesFactoryImpl.java:60)
    at org.richfaces.application.InitializationListener.createFactory(InitializationListener.java:110)
    at org.richfaces.application.InitializationListener.onStart(InitializationListener.java:69)
    at org.richfaces.application.InitializationListener.processEvent(InitializationListener.java:167)
    at javax.faces.event.SystemEvent.processListener(SystemEvent.java:108)
    at com.sun.faces.application.ApplicationImpl.processListeners(ApplicationImpl.java:2190)
    at com.sun.faces.application.ApplicationImpl.invokeListenersFor(ApplicationImpl.java:2163)
    at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:303)
    at org.jboss.as.jsf.injection.weld.ForwardingApplication.publishEvent(ForwardingApplication.java:294)
    at com.sun.faces.config.ConfigManager.publishPostConfigEvent(ConfigManager.java:692)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:260)
    ... 9 more

我该如何解决这个问题?

前端工件不属于 EAR 的 /lib。他们属于 WAR 的 /WEB-INF/lib。否则会使后端(EJB)在其他前端(其他 WARs)上完全不可重用,例如 Spring MVC、JAX-RS RESTful、“Plain vanilla”JSP/Servlet, 等等..等等.. Using/importing JSF FacesContext 和诸如EJB class 中的Servlet HttpServletRequest 之类的朋友已经是一个严重的大红色警报。你不应该那样做。

将该代码移至 WAR。或者,如果您打算使其可在各种 WAR 中重复使用,请将其设为 Web 片段项目,然后它可以作为 /WEB-INF/lib 中的另一个 JAR 结束。

另请参阅:

  • JSF Service Layer