【问题标题】:Why JAX-RS @ApplicationPath is not working in Tomcat为什么 JAX-RS @ApplicationPath 在 Tomcat 中不起作用
【发布时间】:2021-05-17 09:24:56
【问题描述】:

我刚刚启动了一个 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>

web.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) 中尝试了相同的项目,但发生了同样的事情,所以从这里无处可去。

【问题讨论】:

标签: tomcat jax-rs


【解决方案1】:

正如 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(发音为 plume)帮助组织 从 Eclipse Glassfish 迁移到 Apache TomEE 项目。如果你 没有从 Glassfish 迁移到 TomEE,你可以忽略这个 分布。

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

【讨论】:

    猜你喜欢
    • 2020-09-08
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    相关资源
    最近更新 更多