【问题标题】:How to send a JsonObject in JerseyClient POST call?如何在 RestClient POST 调用中发送 Json 对象?
【发布时间】:2015-06-17 18:30:49
【问题描述】:

我有一个 POJO 类,其中一个元素是 JSONObject 类型:

 public static class TestRequest {
    org.json.JSONObject data;
  }

我想使用 JerseyClient 通过 POST 调用发送它。

我试过这个:

 Client client = new Client();
    TestRequest request = new TestRequest();
    Map<Long, String> data = Maps.newHashMap();
    data.put(1L, "abc");

    JSONObject object = new JSONObject(data);
    request.setData(object);

    ClientResponse response = client.resource("http://localhost:18000/test/url")
            .accept(MediaType.APPLICATION_JSON_TYPE)
            .type(MediaType.APPLICATION_JSON_TYPE)
            .post(ClientResponse.class, request);

这失败并出现错误: 找不到类 org.json.JSONObject 的序列化程序

然后我添加了这个:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

client.resource("http://localhost:18000/test/url")
            .accept(MediaType.APPLICATION_JSON_TYPE)
            .type(MediaType.APPLICATION_JSON_TYPE)
            .post(ClientResponse.class, mapper.writeValueAsBytes(request));

这不会失败,但是在实际发送的请求正文中,data 为空 json。

知道如何让它工作吗?

将它保留为 JsonObject 的原因是我将从一个服务中获取它,并将其传递给另一个服务而不实际使用它。所以我不想为data的内部建模。

【问题讨论】:

    标签: java json rest jersey jersey-client


    【解决方案1】:

    您应该为 JSONObject 添加(反)序列化器 - jackson-datatype-json-org

    <dependency>
       <groupId>com.fasterxml.jackson.datatype</groupId>
       <artifactId>jackson-datatype-json-org</artifactId>
       <version>2.4.0</version>
    </dependency>
    

    并注册模块:

    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new JsonOrgModule());
    

    【讨论】:

    • 谢谢。它确实解决了一点问题。就像,如果 JsonObject 是 String 到 String 的映射,它可以正常工作,如果它是 Map 它会抛出错误,说不能将 Long 转换为 String。看起来它默认一切都是字符串类型。
    猜你喜欢
    • 2017-09-30
    • 1970-01-01
    • 2014-02-07
    • 2022-06-14
    • 2011-10-02
    • 2011-11-11
    • 1970-01-01
    • 2020-06-17
    • 2020-04-02
    相关资源
    最近更新 更多