迁移到JSF 2.3,MyFaces初始化问题

问题描述 投票:0回答:1

我正在升级由两个项目“ common”和“ myapp”组成的应用程序。我现在将其升级到JSF 2.3(MyFaces)Primefaces 7,但我不知道如何避免初始化失败。

我应该注意,还[进行了其他更改。两个项目均已成功升级到OpenJDK 11,Tomcat 9,并已使用Maven进行了升级。随着对JSF 2.3的更改,不再支持托管bean来支持JAVA的CDI API,默认情况下,JAVA 11中不再支持托管bean。因此,我引入了OpenWebBeans 2.0DeltaSpike 1.9]。 1。尽管有所有这些动态的部分,该应用程序仍在更新JSF的工作中,所以我认为问题就在这里。

至此,我有两种可能的配置,都失败了。使用一种配置,我会收到此错误:

[main] ERROR [Catalina].[localhost].[/myapp] - StandardWrapper.Throwable No Factories configured for this Application. This happens if the faces-initialization does not work at all - make sure that you properly include all configuration settings necessary for a basic faces application and that all the necessary libs are included. Also check the logging output of your web application and your container for any exceptions! If you did that and find nothing, the mistake might be due to the fact that you use some special web-containers which do not support registering context-listeners via TLD files and a context listener is not setup in your web.xml. A typical config looks like this; <listener> <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class> </listener>

因此,显而易见的解决方案是添加侦听器,但随后我得到了:

[main] ERROR myfaces.config.FacesConfigurator - No ManagedBeanDestroyerListener instance found, thus @PreDestroy methods won't get called in every case. This instance needs to be published before configuration is started.

这似乎是一个排序问题,其中在Faces配置开始之前StartupServletContextListener没有发布ManagedBeanDestroyerListener。但是,在我的研究中,我读到不需要StartupServletContextListener,因为它是从JSF jars中的TLD自动加载的。

任何人都知道这里发生了什么吗?我该如何克服?

以下是我的pom和web.xml的删节版:

common / pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.company</groupId> <artifactId>common</artifactId> <version>2.1.8</version> <properties> <dependency.locations.enabled>false</dependency.locations.enabled> <owb.version>2.0.12</owb.version> <deltaspike.version>1.9.1</deltaspike.version> </properties> <repositories> <repository> <id>local_repository</id> <url>https://server.company.com/repository</url> </repository> </repositories> <dependencyManagement> <dependencies> <dependency> <groupId>org.apache.deltaspike.distribution</groupId> <artifactId>distributions-bom</artifactId> <version>${deltaspike.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.apache.myfaces.core</groupId> <artifactId>myfaces-api</artifactId> <version>2.3.5</version> </dependency> <dependency> <groupId>org.apache.myfaces.core</groupId> <artifactId>myfaces-impl</artifactId> <version>2.3.5</version> </dependency> <dependency> <groupId>org.apache.myfaces.core.internal</groupId> <artifactId>myfaces-impl-shared-public</artifactId> <version>2.3.5</version> </dependency> <!-- Stored in local maven repository --> <dependency> <groupId>org.primefaces</groupId> <artifactId>primefaces</artifactId> <version>7.0</version> </dependency> <!-- Stored in local maven repository --> <dependency> <groupId>org.primefaces</groupId> <artifactId>all-themes</artifactId> <version>1.0.10</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.0.9.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.0.9.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>4.0.9.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.0.9.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.batch</groupId> <artifactId>spring-batch-core</artifactId> <version>2.2.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> <version>1.0.3.RELEASE</version> </dependency> <dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>catalina</artifactId> <version>6.0.53</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-util</artifactId> <version>9.0.12</version> <scope>provided</scope> </dependency> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.3</version> </dependency> <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-impl</artifactId> <version>1.2.5</version> </dependency> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-spec</artifactId> <version>1.2.5</version> </dependency> <dependency> <groupId>org.apache.myfaces.core</groupId> <artifactId>myfaces-bundle</artifactId> <version>2.3.5</version> </dependency> <dependency> <groupId>javax.enterprise</groupId> <artifactId>cdi-api</artifactId> <version>2.0.SP1</version> </dependency> <!-- OpenWebBeans - implements CDI Container --> <dependency> <groupId>org.apache.openwebbeans</groupId> <artifactId>openwebbeans-spi</artifactId> <version>${owb.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.openwebbeans</groupId> <artifactId>openwebbeans-impl</artifactId> <version>${owb.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.openwebbeans</groupId> <artifactId>openwebbeans-web</artifactId> <version>${owb.version}</version> </dependency> <dependency> <groupId>org.apache.openwebbeans</groupId> <artifactId>openwebbeans-jsf</artifactId> <version>${owb.version}</version> </dependency> <!-- DeltaSpike - manages CDI container --> <dependency> <groupId>org.apache.deltaspike.core</groupId> <artifactId>deltaspike-core-api</artifactId> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.deltaspike.modules</groupId> <artifactId>deltaspike-jsf-module-api</artifactId> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.deltaspike.core</groupId> <artifactId>deltaspike-core-impl</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.deltaspike.modules</groupId> <artifactId>deltaspike-jsf-module-impl</artifactId> <scope>runtime</scope> </dependency> <!-- CDI Control API --> <dependency> <groupId>org.apache.deltaspike.cdictrl</groupId> <artifactId>deltaspike-cdictrl-api</artifactId> <scope>compile</scope> </dependency> <!-- CDI Control for OpenWebBeans --> <dependency> <groupId>org.apache.deltaspike.cdictrl</groupId> <artifactId>deltaspike-cdictrl-owb</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.deltaspike.modules</groupId> <artifactId>deltaspike-servlet-module-api</artifactId> <version>${deltaspike.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.deltaspike.modules</groupId> <artifactId>deltaspike-servlet-module-impl</artifactId> <version>${deltaspike.version}</version> <scope>runtime</scope> </dependency> </dependencies> <build> <sourceDirectory>src</sourceDirectory> <testSourceDirectory>test</testSourceDirectory> <resources> ... </resources> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <source>11</source> <target>11</target> <debug>${debugBuild}</debug> <debuglevel>lines,vars,source</debuglevel> </configuration> </plugin> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.1.0</version> ... </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.1.0</version> ... </plugin> </plugins> </build> </project>

myapp / pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.company</groupId> <artifactId>myapp</artifactId> <version>0.1.0</version> <packaging>war</packaging> <properties> <commonVersion>2.1.8</commonVersion> <dependency.locations.enabled>false</dependency.locations.enabled> </properties> <dependencies> <dependency> <groupId>com.company</groupId> <artifactId>common</artifactId> <version>${commonVersion}</version> </dependency> </dependencies> <build> <sourceDirectory>src</sourceDirectory> <testSourceDirectory>test</testSourceDirectory> <resources> <resource> <directory>resources</directory> <excludes> <exclude>**/*.java</exclude> </excludes> </resource> </resources> <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.1</version> <configuration> <warSourceDirectory>WebContent</warSourceDirectory> </configuration> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <source>11</source> <target>11</target> </configuration> </plugin> </plugins> </build> </project>

common / META-INF / web-fragment.xml

<?xml version="1.0" encoding="UTF-8"?> <web-fragment metadata-complete="true" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd"> <name>common</name> <filter> <filter-name>ResourceFilter</filter-name> <filter-class>com.company.common.web.ResourceFilter</filter-class> <async-supported>true</async-supported> </filter> <filter-mapping> <filter-name>ResourceFilter</filter-name> <url-pattern>/javax.faces.resource/*</url-pattern> <url-pattern>/resources/*</url-pattern> </filter-mapping> <filter> <filter-name>PrimeFaces FileUpload Filter</filter-name> <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class> <init-param> <param-name>thresholdSize</param-name> <param-value>100000000</param-value> </init-param> </filter> <filter-mapping> <filter-name>PrimeFaces FileUpload Filter</filter-name> <servlet-name>Faces Servlet</servlet-name> </filter-mapping> <listener> <display-name>httpSessionListener</display-name> <listener-class>com.company.common.usersession.UserSessionListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>org.apache.myfaces.annotation.USE_CDI_FOR_ANNOTATION_SCANNING</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>javax.faces.FACELETS_BUFFER_SIZE</param-name> <param-value>65535</param-value> </context-param> <context-param> <param-name>primefaces.THEME</param-name> <param-value>mytheme</param-value> </context-param> <context-param> <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION</param-name> <param-value>20</param-value> </context-param> <context-param> <param-name>org.apache.myfaces.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION</param-name> <param-value>2</param-value> </context-param> <context-param> <param-name>org.apache.myfaces.SERIALIZE_STATE_IN_SESSION</param-name> <param-value>false</param-value> </context-param> <context-param> <param-name>org.apache.myfaces.RESOURCE_MAX_TIME_EXPIRES</param-name> <param-value>31536000000</param-value> <!-- 1 year --> </context-param> <context-param> <param-name>primefaces.UPLOADER</param-name> <param-value>commons</param-value> </context-param> </web-fragment>

myapp / WEB-INF / web.xml

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <absolute-ordering> <name>common</name> <!-- Get the common web fragment --> </absolute-ordering> <!-- AppApplicationContextListenerhas to happen before WebBeansConfigurationListener so that the application context (e.g. app name, db connections) is set before web beans are scanned --> <listener> <listener-class>com.company.application.app.AppApplicationContextListener</listener-class> </listener> <listener> <listener-class>org.apache.webbeans.servlet.WebBeansConfigurationListener</listener-class> </listener> <!-- INCLUDE ??? --> <listener> <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class> </listener> <context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> </context-param> <!-- Faces Servlet can't be moved into common's web-fragment.xml due to a bug in Apache's MyFaces --> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> <!-- or possibly: --> <!-- <url-pattern>*.jsf</url-pattern> --> </servlet-mapping> </web-app>
maven jsf myfaces jsf-2.3
1个回答
0
投票
我想我可能已经解决了这个问题,尽管我还没有启动并运行。这里有几个组件在起作用。

行家:

作为Maven的新手,我不知道如何以及何时更新项目并正确执行Maven构建。因此,我可能没有测试我的更改,而失败仅在之后强制更新之后才报告。这是我发现并修复的要点。

[caveat:我不主张正确性,但是如果提供更正,将进行编辑]

    显然,当处理另一个引用的项目时,m2e无法正确处理测试jar。因此,使用<dependency><classifier>tests</classifier><type>test-jar</type>块将不起作用,但是以下内容会将测试源复制到相关项目中进行编译。 (确保适当地编辑<source>值,并在Eclipse中运行的Maven中启用m2e概要文件)
  • <profiles> <profile> <id>m2e</id> <activation> <property> <name>m2e.version</name> </property> </activation> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>3.0.0</version> <executions> <execution> <id>include-test-source-eclipse</id> <phase>generate-test-sources</phase> <goals> <goal>add-test-source</goal> </goals> <configuration> <sources> <source>../common/test/java</source> </sources> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>
    • org.apache.myfaces.core:myfaces-bundle只是org.apache.myfaces.core:myfaces-apiorg.apache.myfaces.core:myfaces-impl合并为一个程序包。包含其中一个或多个,但不能同时包含两者。
    • 尽管我在Apache上读过什么,但DeltaSpike并没有使启动CDI(OpenWebBeans)变得更加容易,因此我删除了它。似乎注册OpenWebBeans启动侦听器就足够了(请参阅下文)。
    • cobertura(org.codehaus.mojo:cobertura-maven-plugin)不支持JDK 11。人们推荐使用JaCoCo#67代替它。

    web.xml

    从托管bean转换为CDI时,web.xml中的以下行是必需的。不建议使用托管Bean,但仍默认启用它。

    <context-param> <param-name>org.apache.myfaces.SUPPORT_MANAGED_BEANS</param-name> <param-value>false</param-value> </context-param> <context-param> <param-name>org.apache.myfaces.annotation.USE_CDI_FOR_ANNOTATION_SCANNING</param-name> <param-value>true</param-value> </context-param>

    以下是我当前正在使用的侦听器(及其顺序):

    <listener> <listener-class>com.company.application.app.MyApplicationContextListener</listener-class> </listener> <listener> <listener-class>org.apache.webbeans.servlet.WebBeansConfigurationListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class> </listener>

    faces-config.xml:

    人脸配置文件可以位于两个位置:WEB-INF下或META-INF下。我们的应用程序文件位于WEB-INF下,共享的公共文件位于META-INF下。但是我发现初始化代码希望将META-INF下的文件称为“ standard-faces-config.xml”。我们的不是。

    我还在MyFaces 2.3中发现了一个可能的错误。初始化代码在faces-config.xml文件中查找动作侦听器,如果指定,则将其创建。但是,默认实现的构造函数希望提供基本的动作侦听器,如果没有,则提供null。但是初始化代码会检查基本侦听器是否存在,如果不存在,则尝试调用不存在的

    default

  • 构造函数,而不是向现有的参数化构造函数提供null。因此,我不得不创建一个子类以提供默认的构造函数。import org.primefaces.application.DialogActionListener; public class DialogActionListenerCompatibility extends DialogActionListener { // Providing a required default constructor public DialogActionListenerCompatibility() { super(null); } }
    当前位置:

    我很抱歉包含了我的大部分流程。设置正常后,我将对此进行调整。但是此时,Maven生成没有错误运行,服务器启动也没有错误(尽管有一些次要的和可理解的警告)。 @tandraschko,似乎确实需要将MyFaces StartupServletContextListener包含在web.xml中。而且奇怪的“未发布Bean Destroyer”错误似乎是由于切换到CDI而没有禁用MyFaces的Managed Bean支持。

    我非常欢迎任何反馈来确认或纠正这些更改。

    © www.soinside.com 2019 - 2024. All rights reserved.