gpt4 book ai didi

tomcat - 为什么 JAX-RS @ApplicationPath 在 Tomcat 中不起作用

转载 作者:行者123 更新时间:2023-12-05 04:53:03 24 4
gpt4 key购买 nike

我刚刚引导了一个 Intellij JAX-RS 项目,但在尝试运行时,我得到了样板代码提供的“/api/hello-world”的 404。

HelloServlet 在 Tomcat 10 上工作正常,所以我认为它可能是配置中的某些东西,Intellij 可能没有让我了解,我不知道如何修复它!

我试图将 servlet 部分添加到 web.xml(在代码块的末尾),但 IDE 提示:“‘com.example.demo.HelloApplication’不可分配给‘javax.servlet.Servlet,jakarta.servlet.Servlet’”

我很好奇,因为我使用的不是“javax”而是“jakarta”:

应用:

package com.example.demo;

import jakarta.ws.rs.ApplicationPath;
import jakarta.ws.rs.core.Application;

@ApplicationPath("/api")
public class HelloApplication extends Application {}

资源:

package com.example.demo;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;

@Path("/hello-world")
public class HelloResource {

@GET
@Produces("text/plain")
public String hello() {
return "Hello, World!";
}
}

Servlet(工作)

package com.example.demo;

import java.io.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;

@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {

private String message;

public void init() {
message = "Hello World!";
}

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");

// Hello
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>" + message + "</h1>");
out.println("</body></html>");
}

public void destroy() {
}
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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.example</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<name>demo</name>
<packaging>war</packaging>

<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
<junit.version>5.7.0</junit.version>
</properties>

<dependencies>
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>9.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.0</version>
</plugin>
</plugins>
</build>
</project>

网络.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<servlet>
<servlet-name>Demo</servlet-name>
<servlet-class>com.example.demo.HelloApplication</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
</web-app>

我在 javax (Tomcat 9) 中尝试了相同的项目,但同样的事情发生了,所以从这里无路可走。

最佳答案

正如 BalusC 所说,Tomcat 不是像 Glassfish 那样的 JakartaEE (JavaEE) 应用服务器。

您可以构建具有 JAX-RS 和 CDI 支持的 Tomcat:

https://ci.apache.org/projects/tomcat/tomcat10/docs/cdi.html#JAX-RS_support

但是,有一个 Tomcat 项目已经为您做到了这一点,而且还做得更多:

https://tomee.apache.org/

它同样受到喜爱的 Tomcat + Jakarta EE 支持。

安装 TomEE Plume 后,一切都运行良好。

如果您像我一样对要下载什么版本才能使用 JAX-RS 感到困惑,可以在 https://www.tomitribe.com/blog/tomee-webprofile-vs-tomee-microprofile-vs-tomee-vs-tomee-plume/ 找到一篇有趣的文章。这可能会澄清。

文章作者说:

TomEE PluME (pronounced plume) assists organizations that aremigrating from Eclipse Glassfish to the Apache TomEE project. If youare not migrating from Glassfish to TomEE, you can ignore thisdistribution.

如果您不是来自 Glassfish,您也可以尝试 TomEE Plus。

关于tomcat - 为什么 JAX-RS @ApplicationPath 在 Tomcat 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66191978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com