以JSON对象

时间:2018-03-26 11:43:43

标签: java json

我在我的控制器类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";
}

问题在于我通过执行POST发送curl

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。但是,即使使用像{"key":"value"}这样的正确代码,代码也无法正常工作。

3 个答案:

答案 0 :(得分:1)

据我所知,泽西使用杰克逊的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";
}

答案 1 :(得分:1)

我解决了这个问题。在扩展register(JacksonFeature.class)的类中,必须有public class ApplicationConfig extends ResourceConfig { public ApplicationConfig() { super(MyController.class); property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true); register(JacksonFeature.class); } } 条指令,例如:

{{1}}

答案 2 :(得分:0)

确保您有一个实现 类路径中的MessageBodyReader,可以使用JSON