【发布时间】:2018-09-04 13:11:53
【问题描述】:
我在我的控制器类 a 中有以下方法:
import javax.json.Json;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
@POST
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.TEXT_PLAIN})
@Path("/message")
public String postMessage(Json json,
@Context HttpServletRequest request) {
System.out.println("message");
return "ok";
}
问题是当我通过执行curl 发送POST 时:
curl -H "Content-Type: application/json" -X
POST -d '{"key":"value"}' http://localhost:8080/message
我收到HTTP Status 415 - Unsupported Media Type,就好像我没有发送 JSON。当我将 Json json, 更改为 String body 时,控制器工作正常。
在web.xml 我有:
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
编辑
我的 JSON 格式错误,正如 cmets 中所建议的那样。但是,即使使用像 {"key":"value"} 这样的正确代码,该代码也无法正常工作。
【问题讨论】:
-
您的 JAX-RS 实现中是否启用了 JSON 映射?
-
如何检查?
-
您使用的网址是否正确?根据您发布的代码,它应该是
http://localhost:8080/message而不是http://localhost:8080/get/message -
您还发送了不正确的 json:
'{"key":"value", "user"}'- 不是有效的,请为“用户”添加一个值。 -
您是否尝试将 POJO 作为参数而不是 javax.json.Json?像
public String postMessage(MyMessage msg) { }这样的东西,其中MyMessage是一个带有String key字段的类。