【问题标题】:Receiving data as JSON object以 JSON 对象的形式接收数据
【发布时间】: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 字段的类。

标签: java json


【解决方案1】:

确保你有一个实现 MessageBodyReader 在你的类路径中,这可能会消耗 JSON

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 您说得对,对象映射器不知道如何映射。我缺少依赖项,我 solved it。现在MyMessage msg = mapper.readValue("{\"key\": \"value\"}", MyMessage.class); 效果很好。但是,我仍然收到错误Unsupported Media Type。我正在使用你的控制器。
    【解决方案3】:

    我解决了这个问题。在扩展 ResourceConfig 的类中,必须有 register(JacksonFeature.class) 指令,例如:

    public class ApplicationConfig extends ResourceConfig {
    
        public ApplicationConfig() {
            super(MyController.class);
    
            property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true);
            register(JacksonFeature.class);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-12
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      相关资源
      最近更新 更多