jakarta-ee - 由于未定义的组件类型 jakarta.faces.ViewRoot,在 TOMEE-9.0 PLUS 上运行简单的 JSF Web 应用程序无法正常启动

标签 jakarta-ee apache-tomee

我希望 TOMEE 社区的人能够看到这一点。我不确定是否最好在 TOMEE Jira 项目中提交问题。我在Linux和MAC上的PC上测试了相同的场景,结果相同

简而言之,在运行 JSF 应用程序时,在部署此 webapp 后出现错误使用eclipse和TOMEE-9.0.0-M7 plus。启动期间一切看起来都很好,但是当到达浏览器中的应用程序上下文时,我收到错误(请参阅代码块)

Here是我测试的项目的GitHub存储库

注意:我没有使用 Maven 插件来运行 war ,我在 Eclipse 中设置了 TOMEE。

谢谢。

这里是堆栈跟踪:

SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/samplejakarta9] threw exception [Undefined component type jakarta.faces.ViewRoot] with root cause
jakarta.faces.FacesException: Undefined component type jakarta.faces.ViewRoot
    at org.apache.myfaces.application.ApplicationImpl.createComponent(ApplicationImpl.java:1504)
    at org.apache.myfaces.application.ApplicationImpl.createComponent(ApplicationImpl.java:1472)
    at jakarta.faces.application.ApplicationWrapper.createComponent(ApplicationWrapper.java:133)
    at org.apache.myfaces.shared.view.ViewDeclarationLanguageBase.createView(ViewDeclarationLanguageBase.java:53)
    at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.createView(FaceletViewDeclarationLanguage.java:2056)
    at org.apache.myfaces.application.ViewHandlerImpl.createView(ViewHandlerImpl.java:264)
    at jakarta.faces.application.ViewHandlerWrapper.createView(ViewHandlerWrapper.java:115)
    at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage$FaceletViewMetadata.createMetadataView(FaceletViewDeclarationLanguage.java:2758)
    at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:252)
    at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:195)
    at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:142)
    at jakarta.faces.webapp.FacesServlet.service(FacesServlet.java:204)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:223)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
    at org.apache.openejb.server.httpd.EEFilter.doFilter(EEFilter.java:67)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
    at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke(OpenEJBSecurityListener.java:97)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:353)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:870)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1696)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:834)    

最佳答案

tl;博士

9.0.0-M7 容器正在使用 MyFaces 版本 (2.3.8),该版本尚未准备好 Jakarta 命名空间。

查看相关文档here ,其中指出:

3.0.x The upcoming Jakarta Faces 3.0. It's equals to JSF 2.3 but with "jakarta.faces" packages and constants instead of "javax.faces"

我刚刚创建了TOMEE-3754,并将更新依赖项,因此它将包含在下一个版本中。

长版

TomEE 9.0.0-M7 是通过字节码转换从与 TomEE 8.0.x 系列相同的代码库(即 JavaEE 命名空间)构建的。

目前,两个版本都在版本 2.3.8 中捆绑了 MyFaces,该版本无法处理 Jakarta 命名空间。需要升级到 MyFaces 3.0.x 版本。

要修复您的示例,您必须手动将 MyFaces 版本更改为 3.0.0。为此,只需删除

myfaces-api-2.3.8.jar
myfaces-impl-2.3.8.jar

在容器的lib文件夹中。然后,您可以通过 3.0.0 版本替换它们

您还可以通过 TomEE Maven 插件配置此行为。你的 POM 会是这样的:

    <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>${maven-war-plugin.version}</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.tomee.maven</groupId>
            <artifactId>tomee-maven-plugin</artifactId>
            <version>8.0.6</version> <!-- Note: No 9.0.0-M7 Maven Plugin is available yet but we can use the old one  -->
            <configuration>
                <tomeeVersion>9.0.0-M7</tomeeVersion>
                <tomeeClassifier>plus</tomeeClassifier>
                <debug>false</debug>
                <tomeeHttpPort>8282</tomeeHttpPort>
                <debugPort>5005</debugPort>
                <args>-Dfoo=bar</args>
                <config>${project.basedir}/src/test/tomee/conf</config>
                <libs>
                    <lib>remove:myfaces</lib>
                    <!-- Adding MyFaces 3.0.0 JSF implementation  -->
                    <lib>org.apache.myfaces.core:myfaces-impl:3.0.0</lib>
                    <lib>org.apache.myfaces.core:myfaces-api:3.0.0</lib>
                </libs>
                <skipCurrentProject>true</skipCurrentProject>
                <webapps>
                    <webapp>
                        com.github.gdiazs:sample-jakarta9:1.0.0-SNAPSHOT
                    </webapp>
                </webapps>
            </configuration>
        </plugin>
    </plugins>
</build>

关于jakarta-ee - 由于未定义的组件类型 jakarta.faces.ViewRoot,在 TOMEE-9.0 PLUS 上运行简单的 JSF Web 应用程序无法正常启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67729364/

相关文章:

java - Apache TomEE+ - 部署 war 失败 - 从 tomcat 1.6 迁移

java - tomee中如何加密数据源密码或数据源

JSF 2.3 具有泛型的自定义转换器

java - Activiti - 如何同步用户任务

java - 多个线程访问同一个文件

javascript - Jersey 客户端接收 pojo us 字节

java - 为什么如果我尝试执行包中包含 main() 方法的类,我会收到错误消息?

Java开发标准和工具(与C#相比)

java - TomEE 7.0.2 如何禁用 CXF + RS

java - TomEE + OpenJPA + IntelliJ 实体不持久