You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用org.apache.cxf.jaxrs.client.WebClient的PUT请求Payload格式问题

解决CXF WebClient PUT请求Payload格式不匹配问题

你的问题核心很明确:服务器期望value字段是一个包含转义引号的JSON字符串,但你当前的代码直接将Map作为value值,导致序列化后变成了嵌套的JSON对象,而非转义后的字符串格式。

解决方案思路

要让value字段符合服务器要求,需要先把内部的Map转换成转义后的JSON字符串,再将这个字符串作为KeyValueMessage的value值,而不是直接传入Map。这样整个Payload序列化后,value就会是带转义引号的字符串格式。

具体代码示例

这里以Jackson的ObjectMapper为例(你也可以用其他JSON工具类,比如Gson),修改你的代码如下:

private void callClient4(RestClient client) {
    // 1. 构建内部键值对Map
    Map<String, String> innerMap = new HashMap<>();
    innerMap.put("intKey1", "value1");
    innerMap.put("intKey2", "value2");
    
    // 2. 将Map转为转义后的JSON字符串
    ObjectMapper objectMapper = new ObjectMapper();
    String innerJsonString = null;
    try {
        // 此时innerJsonString的值为:"{\"intKey1\":\"value1\",\"intKey2\":\"value2\"}"
        innerJsonString = objectMapper.writeValueAsString(innerMap);
    } catch (JsonProcessingException e) {
        // 处理JSON序列化异常
        e.printStackTrace();
        return;
    }
    
    // 3. 构建符合要求的KeyValueMessage
    KeyValueMessage<String, String> kv = new KeyValueMessage<>();
    kv.setKey("mainkey");
    kv.setValue(innerJsonString); // 传入转义后的字符串而非Map
    kv.setTtl("100");
    
    // 4. 用WebClient发送PUT请求
    WebClient webClient = WebClient.create(client.getUrl());
    webClient.type(MediaType.APPLICATION_JSON)
            .accept(MediaType.APPLICATION_JSON)
            .put(kv);
}

关键说明

  • 服务器期望的value是字符串类型,而非JSON对象:原来的代码直接传入Map,CXF的序列化器会把它解析成嵌套的JSON结构;而先转成JSON字符串后,序列化器会把它当作普通字符串处理,自动保留内部的转义引号。
  • 如果你的KeyValueMessage泛型定义中value是Map类型,需要调整为String类型,或者做类型兼容处理,确保能接受字符串作为value的值。

内容的提问来源于stack exchange,提问作者user2549842

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:42:49