使用 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 管理器中,它应该如下所示:
如果您的应用程序未命名为 EventCalendar
,而是命名为 myApp
,则 URL 将是 localhost:8080/myApp/rest/EventCalendar/hello
我觉得你的源代码没问题,你符合最低要求。我相信 tomcat 配置中的问题。例如,检查 tomcat 是否正常工作并响应其根目录 url 并注意 tomcat webapps 文件夹中的项目目录名称。
None 其他给定的解决方案出于某种原因帮助了我。
我最终没有创建导入最新 jars 的 Maven 项目并为 eclipse 安装插件自动创建服务并将它们添加到 web.xml.
不过感谢大家的帮助:)!
插件:
RESTful Eclipse 插件
编辑:只是想补充一点,这消除了我的服务器设置错误的可能性。
只是发布所有 类,我尝试了来自不同教程/指南等的大量不同设置。但它们都会导致 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
<?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 管理器中,它应该如下所示:
如果您的应用程序未命名为 EventCalendar
,而是命名为 myApp
,则 URL 将是 localhost:8080/myApp/rest/EventCalendar/hello
我觉得你的源代码没问题,你符合最低要求。我相信 tomcat 配置中的问题。例如,检查 tomcat 是否正常工作并响应其根目录 url 并注意 tomcat webapps 文件夹中的项目目录名称。
None 其他给定的解决方案出于某种原因帮助了我。 我最终没有创建导入最新 jars 的 Maven 项目并为 eclipse 安装插件自动创建服务并将它们添加到 web.xml.
不过感谢大家的帮助:)!
插件: RESTful Eclipse 插件
编辑:只是想补充一点,这消除了我的服务器设置错误的可能性。