Gilberto Albino
Gilberto Albino

Reputation: 2745

Why JAX-RS @ApplicationPath is not working in Tomcat

I have just bootstrap an Intellij JAX-RS project, but when trying to run I got an 404 to the "/api/hello-world" provided by the boilerplate code.

The HelloServlet works correctly on Tomcat 10, so I thing it may be something in the configs that Intellij may have not got me covered and I have no clues on how to fix it!

I tried to add the servlet section to web.xml (at the end of code blocks), but IDE complaints: "'com.example.demo.HelloApplication' is not assignable to 'javax.servlet.Servlet,jakarta.servlet.Servlet'"

I got curious because I am not using "javax" but "jakarta":

Application:

package com.example.demo;
    
import jakarta.ws.rs.ApplicationPath;
import jakarta.ws.rs.core.Application;
    
@ApplicationPath("/api")
public class HelloApplication extends Application {}

Resource:

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 (Working)

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>

I tried the same project in javax (Tomcat 9) but the same happened, so no where to go from here.

Upvotes: 3

Views: 2672

Answers (1)

Gilberto Albino
Gilberto Albino

Reputation: 2745

As commented by BalusC Tomcat is not a JakartaEE (JavaEE) application server as Glassfish.

You can build Tomcat with JAX-RS and CDI support:

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

However, there is a Tomcat project that already does that and more for you:

https://tomee.apache.org/

It is the same loved Tomcat + Jakarta EE support.

After installing TomEE Plume I got everything working like a charm.

If you got confused like me about what version to download in order to use JAX-RS, there is an interesting article available at https://www.tomitribe.com/blog/tomee-webprofile-vs-tomee-microprofile-vs-tomee-vs-tomee-plume/ that may clarify.

The author of the article says:

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

If you are not coming from Glassfish, you may try TomEE Plus as well.

Upvotes: 2

Related Questions