Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 如何在耳朵中正确使用OmniFaces_Jsf 2_Ear_Omnifaces_Skinny War - Fatal编程技术网

Jsf 2 如何在耳朵中正确使用OmniFaces

Jsf 2 如何在耳朵中正确使用OmniFaces,jsf-2,ear,omnifaces,skinny-war,Jsf 2,Ear,Omnifaces,Skinny War,我想在我的Jave EE 7应用程序中使用1.7。我的应用程序是一个包含JAR和。我的一些JAR依赖于OmniFaces,因此OmniFaces工件必须在EAR中,而不是在战争中的WEB-INF/lib中 我的耳朵是这样的: EAR +-- lib | +-- [some 3rd party JARs] | `-- omnifaces.jar +-- myEJBs.jar `-- myWAR.war 当我这样说时,OmniFaces转换器(如)没有在JSF中注册,因此无法

我想在我的Jave EE 7应用程序中使用1.7。我的应用程序是一个包含JAR和。我的一些JAR依赖于OmniFaces,因此OmniFaces工件必须在EAR中,而不是在战争中的
WEB-INF/lib

我的耳朵是这样的:

EAR
 +-- lib
 |    +-- [some 3rd party JARs]
 |    `-- omnifaces.jar
 +-- myEJBs.jar
 `-- myWAR.war
当我这样说时,OmniFaces转换器(如)没有在JSF中注册,因此无法工作。对此原因进行了讨论和分析。基本上根据(第11.5.1节扫描注释类的要求),只扫描WARs
WEB-INF/lib
目录

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


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

OmniFaces是一个JSF实用程序库,依赖于JSF、EL和Servlet 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
之外的webapp运行时类路径中的其他位置,例如EAR的
/lib
,甚至服务器或JRE自己的
/lib
。当OmniFaces JAR文件以这种方式放错位置时,webapp将无法找到OmniFaces绑定的JSF/CDI注释类,并在部署或运行时抛出与此相关的异常。为了解决这个问题,把OmniFaces放回WAR的
/WEB-INF/lib

另见:

At声明:“还应注意的是,OmniFaces不能简单地作为EAR库包含,因为依赖关系通常仅在WAR内部可用,如JSF、Servlet和EL。”但是如果我想在我的EJB中使用像
org.omnifaces.config.BeanManager
这样的类该怎么办?在maven用户列表中出现一个问题之后,我认为像BeanManager或Utils这样的omnifaces类目前不应该从WAR之外的类中使用。一个解决方案是将OmniFaces拆分为两个独立的JAR:一个真正的JSF组件库和一个随处可用的公共库。仅用于记录:我只依赖OmniFaces的
BeanManager
类(如上所述)。在EJB中使用CDI是一个有效的用例。但我最终得到了你建议的解决方案,让全方位的人参与战争。谢谢。