我正在开发一个JSF 2.0应用程序(Mojarra + Primefaces)并使用maven构建环境。在我使用faces-config.xml文件注册我的自定义转换器和验证器之前,到目前为止一切顺利。然后我看到了一些JSF 2.0的语法糖 - 基于注释的配置方法。现在我想使用它,而不是xml配置文件。一个问题是Mojarra没有扫描我的注释类。我发现我需要将<faces-config ... metadata-complete="false">
属性设置为false。现在它可以工作,但前提是我以mvn tomcat:run-war
目标启动我的应用程序而不是mvn tomcat:run
动态项目,这对于开发更为舒适。 JSP 2.0的规范说:
如果是WEB-INF / faces-config.xml文件中的元素 包含元数据完整属性,其值为“true”,实现不得执行注释 扫描任何类,除了实现本身提供的那些类。否则,继续 如下:
如果运行时发现应用程序配置资源中的条目与注释之间存在冲突,则 应用程序配置资源中的条目优先。 必须扫描WEB-INF / classes中的所有类。
对于应用程序的WEB-INF / lib目录中的每个jar,如果jar包含“META-INF / faces-config.xml” 文件或与正则表达式“。*。faces-config.xml”(即使是空的)匹配的文件,所有类都在 必须扫描那个罐子。
但它没有说明在maven构建环境中运行的动态项目:)!有没有人有这个问题的解决方案?
干杯,
凯文
答案 0 :(得分:2)
我也有这个问题,但发现添加战争:inplace目标让它对我有用。即使用
mvn clean war:inplace tomcat:run
而不仅仅是'tomcat:run',它应该可以正常工作。
答案 1 :(得分:0)
在我的情况下,Log4jServletContainerInitializer
中的log4j-web
某种程度上阻止了FacesInitializer
中的javax.faces
的调用,这负责处理带注释的JSF类。
使用tomcat8-maven-plugin
和嵌入式tomcat 8.0.52。
war:inplace
有效,或者仅通过手动log4j初始化和上下文管理删除了log4j-web
。
答案 2 :(得分:0)
添加org.apache.myfaces.annotation.SCAN_PACKAGES
对我来说是tomcat7:run
的目标