使用 JAX-RS、球衣和 tomcat 继续获得 404 8,我做错了什么?

Keep getting 404 with JAX-RS, jersey and tomcat 8, what am I doing wrong?

只是发布所有 类,我尝试了来自不同教程/指南等的大量不同设置。但它们都会导致 404。tomcat 8 服务器是干净的安装。

这是我第一次使用 jax-rs 和 jersey,我对 java 有很多经验,对 tomcat 有一些经验 8.

我想尝试实现一个休息服务 api 并将后端与前端分开,似乎 jax-rs 和 jersey 是在 [= 中实现它的最佳解决方案38=](?).

我尝试的地址是:localhost:8080/EventCalendar/rest/hello

产生:

HTTP Status 404 - /EventCalendar/rest/hello

type Status report

message /EventCalendar/rest/hello

description The requested resource is not available.

Apache Tomcat/8.0.32

Pom.xml

<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>EventCalendar</groupId>
  <artifactId>EventCalendar</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.6</version>
        <configuration>
          <warSourceDirectory>WebContent</warSourceDirectory>
          <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
      </plugin>
    </plugins>
  </build>
<dependencies>
    <!-- Servlet 3.0 API -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
    <!-- JAX-RS RESTful Web Services -->
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.9</version>
    </dependency>
</dependencies>
</project>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

</web-app>

RestConfig

import java.util.HashSet;
import java.util.Set;

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

@ApplicationPath("/rest")
public class RESTConfig extends Application {

    public RESTConfig() {
    }

    @Override
    public Set<Class<?>> getClasses() {
        final Set<Class<?>> returnValue = new HashSet<Class<?>>();
        returnValue.add(TestService.class);
        return returnValue;
    }
}

测试服务

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class TestService
{

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String info(){
        return "This is the testservice";
    }
}

在测试服务中设置函数 StringInfo() 的路径 class...

@GET
    @Produces(MediaType.TEXT_PLAIN)
    @Path("/TestService")
    public String info(){
        return "This is the testservice";
    }

另外你还没有在web.xml中设置url....

 <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>org.glassfish.jersey.config.property.packages</param-name>
      <param-value>package-name</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

<servlet-mapping>
        <servlet-name>Jersey REST Service</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

添加所有这些...然后访问 url... localhost:8080/EventCalendar/rest/hello/TestService

您缺少 web.xml

中的 servlet 声明
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <servlet>
        <servlet-name>your.package.RESTConfig</servlet-name>
    </servlet>
    <servlet-mapping>
        <servlet-name>your.package.RESTConfig</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

查看 Jersey 文档 https://jersey.java.net/documentation/latest/user-guide.html#deployment.servlet.3

servlet 必须在您的 web.xml:

中声明
 <servlet>
    <servlet-name>jersey-servlet</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>

    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.my.package.TestService</param-value>
    </init-param>

    <load-on-startup>1</load-on-startup>
  </servlet>



<servlet-mapping>
  <servlet-name>jersey-servlet</servlet-name>
  <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

com.my.package.TestService 替换为您的 class 完全限定名称

还要确保您的 .war 已部署为 EventCalendar。按照您提出问题的方式,您似乎没有注意到 URL 中的应用程序名称位于资源名称之前。在 Tomcat 管理器中,它应该如下所示:

Tomcat manager

如果您的应用程序未命名为 EventCalendar,而是命名为 myApp,则 URL 将是 localhost:8080/myApp/rest/EventCalendar/hello

我觉得你的源代码没问题,你符合最低要求。我相信 tomcat 配置中的问题。例如,检查 tomcat 是否正常工作并响应其根目录 url 并注意 tomcat webapps 文件夹中的项目目录名称。

None 其他给定的解决方案出于某种原因帮助了我。 我最终没有创建导入最新 jars 的 Maven 项目并为 eclipse 安装插件自动创建服务并将它们添加到 web.xml.

不过感谢大家的帮助:)!

插件: RESTful Eclipse 插件

编辑:只是想补充一点,这消除了我的服务器设置错误的可能性。