如何在EAR中正确使用OmniFaces



我想在我的Jave EE 7应用程序中使用OmniFaces 1.7。我的应用程序是一个包含JAR和一个瘦WAR的EAR。我的一些JAR依赖于OmniFaces,所以OmniFaces工件必须在EAR中,但不能在WAR的WEB-INF/lib中。

我的EAR是这样的:

EAR
+-- lib
|    +-- [some 3rd party JARs]
|    `-- omnifaces.jar
+-- myEJBs.jar
`-- myWAR.war

当我这样说的时候,OmniFaces转换器(比如GenericEnumConverter)没有在JSF中注册,也不起作用。原因在这里和这里讨论。基本上,根据JSF 2.0规范(111.5.1注释类扫描要求),只扫描WARsWEB-INF/lib目录。

所以我的问题是:我应该如何在应用程序中包含OmniFaces

包括两次(在EAR/lib和WARWEB-INF/lib中)可能会起作用,但感觉很笨拙。不久前,我在RichFaces 4.3.5(同样的问题)中尝试了它,但没有成功,但导致了IllegalArgumentException: duplicate key: class javax.faces.convert.ByteConverter

OmniFaces是一个JSF实用程序库,它依赖于JSF、EL和Servlet API,这些API通常只能在WAR中使用,而不能在EAR中使用。更重要的是,EJB(一般的业务服务)不应该对特定的前端API(如JSF、EL和Servlet API)有任何依赖关系。这将使它们在其他前端(如JAX-RS、SpringMVC等)上不可用。

您需要将JSF实用程序和组件库(如OmniFaces和PrimeFaces)放在WAR中,而不是放在EAR中。另请参阅OmniFaces主页的安装部分:

OmniFaces被设计为WAR库(web片段库),因此不能放在WAR自己的/WEB-INF/lib之外的web应用程序运行时类路径中的其他位置,例如EAR的/lib,甚至服务器或JRE自己的/lib。当OmniFacesJAR文件以这种方式放错位置时,Web应用程序将无法找到OmniFaces捆绑的JSF/CDI注释类,并在部署或运行时抛出与此相关的异常。要解决这个问题,请将OmniFaces放回WAR的/WEB-INF/lib中。

另请参阅:

  • JSF服务层
  • @共享库上的FacesComponent
  • @Eagle不可用。无法从CDI bean管理器获取EagleBeansRepository

相关内容

  • 没有找到相关文章

最新更新