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

使用Jersey WebTarget API POST嵌套JSON时嵌套属性丢失如何解决?

问题原因

这个问题通常是Jersey默认使用的MOXy JSON序列化组件对嵌套集合类型的序列化支持缺陷导致的,小概率是实体类属性的getter配置错误导致序列化被忽略。

排查与解决步骤

  • 第一步:确认实体类的getter配置正确
    检查User类中roles属性的getter方法为public修饰,且没有标注@JsonIgnore之类的忽略序列化注解:
    public List<Role> getRoles() {
        return roles;
    }
    
    同时确认Role类的roleId、role属性均有public修饰的getter方法。
  • 第二步:替换Jersey的JSON序列化组件为Jackson
    MOXy作为Jersey默认的JSON序列化组件,对嵌套对象、集合的序列化支持不够稳定,替换为Jackson即可解决绝大多数序列化异常问题:
    1. 引入Jackson Jersey适配依赖(以Maven为例):
    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>2.15.3</version> <!-- 版本需与你的Jersey版本兼容,Jersey 3.x对应3.x版本Jackson -->
    </dependency>
    
    1. 在初始化Jersey Client时注册Jackson序列化组件:
    Client client = ClientBuilder.newClient()
            // 注册Jackson作为JSON序列化/反序列化provider
            .register(JacksonJsonProvider.class);
    WebTarget webTarget = client.target("你的接口根地址");
    
  • 第三步:可选强制标注序列化字段
    如果调整后仍有问题,可以在roles属性上添加@JsonProperty注解强制指定该字段参与序列化:
    public class User {
        private String username;
        private String password;
        @JsonProperty
        private final List<Role> roles = new ArrayList<>();
        // 其余getter、setter
    }
    

验证

调整完成后重新发起请求,序列化后的JSON会正常携带roles字段,格式如下:

[{"username":"name","password":"password","roles":[{"roleId":1,"role":"somerole"}]}]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:27:01