我在我的控制器类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状态415 – 不支持的媒体类型,好像我没有发送JSON.当我将Json json更改为String body时,控制器工作正常.
在web.xml中我有:
jersey-serlvet
org.glassfish.jersey.servlet.ServletContainer
com.sun.jersey.api.json.POJOMappingFeature
true
1
编辑
我在评论中建议错误的JSON.但是,即使使用像{“key”:“value”}这样的正确代码,代码也无效.
解决方法:
据我所知,泽西使用杰克逊的ObjectMapper来反序列化.我认为问题可能是对象映射器不知道如何将您的请求映射到javax.json.Json对象,这是一个简单的测试:
import javax.json.Json;
import com.fasterxml.jackson.databind.ObjectMapper;
// (...)
ObjectMapper mapper = new ObjectMapper();
Json json = mapper.readValue("{\"key\": \"value\"}", Json.class);
这会产生一个例外:
UnrecognizedPropertyException: Unrecognized field "key" (class javax.json.Json)
我认为你应该创建一个POJO而不是原始的json对象,例如:
class MyMessage {
public String key; //for simplicity, you probably will use accessor methods
}
同样的测试工作正常:
MyMessage msg = mapper.readValue("{\"key\": \"value\"}", MyMessage.class);
然后您的控制器方法应如下所示:
@POST
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.TEXT_PLAIN})
@Path("/message")
public String postMessage(MyMessage msg) {
System.out.println(msg.key);
return "ok";
}
标签:json,java
来源: https://codeday.me/bug/20190701/1347410.html