我在JBoss WildFly 8.2.0.Final中运行带有EJB + EJB + WAR部署的EAR,使用JSF 2.2和RichFaces 4.5.2.Final。我的问题是,所有RichFaces资源都无法在客户端中正确加载。生成的网址无法通过HTTP 404解析并返回。
部署基于Maven构建,并产生以下结构:
在EJB模块而不是WAR中使用<scope>compile</scope>
的原因是我需要从EJB模块中扩展RichFaces类。我们基于一些组件构建了动态表单生成器。
只要在WAR模块中使用EAR/lib/
而不是WAR/WEB-INF/lib/
将JAR添加到<scope>compile</scope>
和<scope>provided</scope>
,我就会在启动应用服务器时获得以下堆栈跟踪:
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
我该如何解决这个问题?
答案 0 :(得分:1)
前端文物不属于EAR的/lib
。它们属于WAR /WEB-INF/lib
。否则,它会使后端(EJB)在其他前端(其他WAR)上完全无法使用,例如Spring MVC,JAX-RS RESTful,&#34; Plain vanilla&#34; JSP / Servlet等.etc ..在EJB类中使用/导入JSF FacesContext
和诸如Servlet的HttpServletRequest
之类的朋友已经是一个非常大的红色警报。你不应该这样做。
将该代码移至WAR。或者,如果您打算在各种WAR中使其可重用,请将其设置为Web片段项目,然后最终成为/WEB-INF/lib
中的另一个JAR。