我正在学习jax-rs,并且在制作产生JSON的GET请求时,我会获得HTTP状态500内部服务器错误。XML工作正常。
我搜索了其他问题,但找不到解决方案。这可能取决于我目前缺乏知识。但是,从我阅读的内容来看,我的项目在构建路径中缺少一个罐子。
我不使用Maven。我刚刚在Eclipse中创建了一个动态的Web应用程序,并将JAX-RS/Jersey Jars添加到我的Web-Inf/lib目录中,并将它们添加到我的构建路径中。
我正在使用Postman测试Web服务。提出请求时,我正在向标头添加接受:
接受:应用程序/XML-工作正常。接受:应用程序/JSON-内部服务器错误
这是我的(非常简单的代码(代码:
@XmlRootElement
public class Thing {
private String name;
public Thing(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
设置该服务以生产XML和JSON。
@Path("/get")
public class Service {
@GET
@Path("/both")
@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
public Thing getThingResponses(){
Thing t = new Thing();
t.setName("I'm a thing!");
return t;
}
}
任何帮助/指示都将不胜感激。谢谢
您可能忘了添加从Java转换为JSON所需的所有所需依赖项。假设您正在使用Maven,这是您需要的(版本也许不是最后一个,请查看(:
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.webapp</groupId>
<artifactId>restservice</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>restservice Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-bundle</artifactId>
<version>1.19.3</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20140107</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.19.3</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.19.3</version>
</dependency>
</dependencies>
<build>
<finalName>restservice</finalName>
</build>
</project>
然后,您有Web.xml,该Web.xml应该加载定义休息的类:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>com.vogella.jersey.first</display-name>
<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>org.restservice</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>jersey-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
最后一堆像您这样的方法:
package org.restservice;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
/**
* Created by paolo on 06/05/17.
*/
@Path("/hello")
public class Hello {
// This method is called if TEXT_PLAIN is request
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayPlainTextHello() {
return "Hello Jersey";
}
// This method is called if XML or JSON is request
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Thing sayXMLorJSONHello() {
Thing t = new Thing();
t.setName("I'm a thing!");
return t;
}
// This method is called if HTML is request
@GET
@Produces(MediaType.TEXT_HTML)
public String sayHtmlHello() {
return "<html> " + "<title>" + "Hello Jersey" + "</title>"
+ "<body><h1>" + "Hello Jersey" + "</body></h1>" + "</html> ";
}
}
我在tomcat 9上测试了它,我使用的URL是:
localhost:8080/rest/hello与标头:
accept: application/json
accept-encoding: gzip, deflate
accept-language: en-US,en;q=0.8
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
在这里我得到的:
{
"name": "I'm a thing!"
}
祝你好运。
更新:好的,您不使用Maven,在项目的LIB文件夹中添加相同的罐子...或开始使用Maven; - (
您可以检查库是否复制到服务器?我不知道您正在使用哪个服务器
另一方面,您可以显示出错误的跟踪吗?
要解决此问题,我按照Paolof76的建议构建了一个Maven Web应用程序。
但是,我使用了Jersey 2,所以我无法直接遵循示例。
需要以下依赖项才能使JSON介体工作:
<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160810</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.0-m07</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.jaxrs/jackson-jaxrs-json-provider -->
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.9.0.pr3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-moxy -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>2.26-b03</version>
</dependency>
涉及一些反复试验,但我最终到达那里。