泽西岛415不支持的媒体types
我一直在努力,以纠正HTTP错误415 Unsupported Media Type
但它仍然显示媒体不支持的页面。 我在Postman中添加header application/json
。
这是我的Java代码
package lostLove; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.json.JSONObject; @Path("/Story") public class Story { @POST @Consumes({"application/json"}) @Produces(MediaType.APPLICATION_JSON) // @Consumes(MediaType.APPLICATION_JSON) // @Path("/Story") public JSONObject sayJsonTextHello(JSONObject inputJsonObj) throws Exception { String input = (String) inputJsonObj.get("input"); String output = "The input you sent is :" + input; JSONObject outputJsonObj = new JSONObject(); outputJsonObj.put("output", output); return outputJsonObj; } @GET @Produces(MediaType.TEXT_PLAIN) public String sayPlainTextHello() { return "hello"; } }
这里是我的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>LostLove</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>lostLove</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> </web-app>
我们的对象如何序列化和反序列化到响应stream和请求stream,通过MessageBodyWriter
和MessageBodyReader
。
会发生什么是从提供商的registry,将可以处理JSONObject
和媒体typesapplication/json
。 如果找不到,泽西不能处理请求,并将发送415不支持的媒体types。 您通常应该也会在服务器端获得logging的exception。 不知道你是否有机会查看日志。
Jersey没有org.json
对象的标准读写器。 你将不得不在网上search一个实现或自己写一个,然后注册它。 你可以阅读更多关于如何在这里实现它。
或者,您可以接受一个string并返回一个string。 只需使用string参数构造JSONObject
,并在返回时调用JSONObject.toString()
。
我的build议是使用像Jackson这样的数据绑定框架,它可以处理序列化和反序列化模型对象(简单的POJO)。 比如你可以有一个类似的
public class Model { private String input; public String getInput() { return input; } public void setInput(String input) { this.input = input; } }
您可以将Model
作为方法参数
public ReturnType sayJsonTextHello(Model model)
相同的ReturnType
。 只要创build一个POJO为你想要返回的types。 JSON属性基于JavaBean属性名称(遵循上述命名约定的getter / setter)。
为了得到这个支持,你可以添加这个Maven依赖:
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>2.17</version> <!-- make sure the jersey version matches the one you are using --> </dependency>
或者如果你不使用Maven,你可以看到这个post ,可以独立下载的jar包。
一些资源:
- Jersey JSON支持
- jackson文件