使用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即可解决绝大多数序列化异常问题:- 引入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>- 在初始化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
相关产品推荐
相关产品推荐

