我正在使用 JakartaEE 并制作了一种 "hello world" 的 restfulAPI,无法通过访问 URL 获得 return 字符串
I'm using JakartaEE and making a "hello world" kind of restfulAPI, can't get a return string by visiting URL
提供我在这个短视频中采取的每一步:
https://youtu.be/hbSr8sRYuOk
此处的项目代码:https://github.com/LJonn/restapiHelloWorld
运行 tomcat 上本地服务器上的所有内容。
我遇到这个问题已经有一段时间了,运行 不知道问题出在哪里...
我尝试了 URL,例如:“http://localhost:8080/api/hello”和“http://localhost:8080/helloworld/api/hello”,并期望其中之一这些工作。
运行 http://localhost:8080/manager/text/list 显示 helloworld.war 部署正常且工作正常:
OK - Listed applications for virtual host [localhost]
/:running:0:ROOT
/helloworld:running:0:helloworld
/examples:running:0:examples
/host-manager:running:0:host-manager
/manager:running:0:manager
/docs:running:0:docs
那么,为什么我仍然收到 HTTP 状态 404 页面?我该怎么做才能找到问题所在?
这些是我项目的 Maven 依赖项:
<dependencies>
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-web-api</artifactId>
<version>9.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
感谢 Nikos Paraskevopoulos 的评论,看起来从 Tomcat 更改为 TomEE 可能会解决问题,但现在我 运行 遇到了一个问题,其中 .war 文件可以不是 deployed/started,可能是某种版本兼容性问题,tomcat 管理器 GUI 在尝试启动 .war 文件时出现此错误:
FAIL - Application at context path [/helloworld] could not be started
FAIL - Encountered exception [org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/helloworld]]]
查看管理器日志 看起来它与注释和 Java 16 可能有关?:
...
Caused by: java.lang.IllegalArgumentException: Unsupported class file major version 60
at org.apache.xbean.asm7.ClassReader.<init>(ClassReader.java:195)
at org.apache.xbean.asm7.ClassReader.<init>(ClassReader.java:176)
at org.apache.xbean.asm7.ClassReader.<init>(ClassReader.java:162)
at org.apache.xbean.asm7.ClassReader.<init>(ClassReader.java:283)
at org.apache.xbean.finder.AnnotationFinder.readClassDef(AnnotationFinder.java:1176)
... 52 more
01-Sep-2021 15:25:02.185 INFO [http-nio-8080-exec-3] org.apache.catalina.core.ApplicationContext.log HTMLManager: list: Listing contexts for virtual host 'localhost'
我已经尝试检查 Eclipse 上的 JRE 版本,它是 16.0.2,在我看来 tomcat 上的相同版本是 运行。
Tomcat 10.0 和 10.1 不是 完整的 Jakarta EE 9.1 应用程序服务器:您不应该使用 jakarta.jakartaee-web-api
工件,这意味着运行时支持所有 Jakarta EE 9.1 Web Profile 技术。
Tomcat 未实现 Web 配置文件 中要求的所有规范。至少还有四种其他产品。请参阅 this list Jakarta Web Profile 9.1:
- Apache TomEE
- Eclipse Glassfish
- IBM 开放自由
- 红帽 WildFly
您可以在 Tomcat's web site and for Tomcat 10 they translate to this list shown as a Maven POM 代码段中找到支持的技术列表。
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.servlet.jsp</groupId>
<artifactId>jakarta.servlet.jsp-api</artifactId>
<version>3.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.el</groupId>
<artifactId>jakarta.el-api</artifactId>
<version>4.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.websocket</groupId>
<artifactId>jakarta.websocket-api</artifactId>
<version>2.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.security.auth.message</groupId>
<artifactId>jakarta.security.auth.message-api</artifactId>
<version>2.0.0-RC1</version>
<scope>provided</scope>
</dependency>
从 Servlet 3.0 开始,可以使用 servlet pluggability mechanism 添加额外的 Jakarta EE 规范。要使用 JAX-RS,您需要添加:
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>3.0.2</version>
</dependency>
或使用其他 JAX-RS 实现的等效配置。
提供我在这个短视频中采取的每一步: https://youtu.be/hbSr8sRYuOk
此处的项目代码:https://github.com/LJonn/restapiHelloWorld
运行 tomcat 上本地服务器上的所有内容。
我遇到这个问题已经有一段时间了,运行 不知道问题出在哪里... 我尝试了 URL,例如:“http://localhost:8080/api/hello”和“http://localhost:8080/helloworld/api/hello”,并期望其中之一这些工作。
运行 http://localhost:8080/manager/text/list 显示 helloworld.war 部署正常且工作正常:
OK - Listed applications for virtual host [localhost]
/:running:0:ROOT
/helloworld:running:0:helloworld
/examples:running:0:examples
/host-manager:running:0:host-manager
/manager:running:0:manager
/docs:running:0:docs
那么,为什么我仍然收到 HTTP 状态 404 页面?我该怎么做才能找到问题所在?
这些是我项目的 Maven 依赖项:
<dependencies>
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-web-api</artifactId>
<version>9.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
感谢 Nikos Paraskevopoulos 的评论,看起来从 Tomcat 更改为 TomEE 可能会解决问题,但现在我 运行 遇到了一个问题,其中 .war 文件可以不是 deployed/started,可能是某种版本兼容性问题,tomcat 管理器 GUI 在尝试启动 .war 文件时出现此错误:
FAIL - Application at context path [/helloworld] could not be started
FAIL - Encountered exception [org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/helloworld]]]
查看管理器日志 看起来它与注释和 Java 16 可能有关?:
...
Caused by: java.lang.IllegalArgumentException: Unsupported class file major version 60
at org.apache.xbean.asm7.ClassReader.<init>(ClassReader.java:195)
at org.apache.xbean.asm7.ClassReader.<init>(ClassReader.java:176)
at org.apache.xbean.asm7.ClassReader.<init>(ClassReader.java:162)
at org.apache.xbean.asm7.ClassReader.<init>(ClassReader.java:283)
at org.apache.xbean.finder.AnnotationFinder.readClassDef(AnnotationFinder.java:1176)
... 52 more
01-Sep-2021 15:25:02.185 INFO [http-nio-8080-exec-3] org.apache.catalina.core.ApplicationContext.log HTMLManager: list: Listing contexts for virtual host 'localhost'
我已经尝试检查 Eclipse 上的 JRE 版本,它是 16.0.2,在我看来 tomcat 上的相同版本是 运行。
Tomcat 10.0 和 10.1 不是 完整的 Jakarta EE 9.1 应用程序服务器:您不应该使用 jakarta.jakartaee-web-api
工件,这意味着运行时支持所有 Jakarta EE 9.1 Web Profile 技术。
Tomcat 未实现 Web 配置文件 中要求的所有规范。至少还有四种其他产品。请参阅 this list Jakarta Web Profile 9.1:
- Apache TomEE
- Eclipse Glassfish
- IBM 开放自由
- 红帽 WildFly
您可以在 Tomcat's web site and for Tomcat 10 they translate to this list shown as a Maven POM 代码段中找到支持的技术列表。
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.servlet.jsp</groupId>
<artifactId>jakarta.servlet.jsp-api</artifactId>
<version>3.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.el</groupId>
<artifactId>jakarta.el-api</artifactId>
<version>4.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.websocket</groupId>
<artifactId>jakarta.websocket-api</artifactId>
<version>2.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.security.auth.message</groupId>
<artifactId>jakarta.security.auth.message-api</artifactId>
<version>2.0.0-RC1</version>
<scope>provided</scope>
</dependency>
从 Servlet 3.0 开始,可以使用 servlet pluggability mechanism 添加额外的 Jakarta EE 规范。要使用 JAX-RS,您需要添加:
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>3.0.2</version>
</dependency>
或使用其他 JAX-RS 实现的等效配置。