Java Spring中@JsonProperty与@Field注解协同失效问题及解决诉求
isValid在Jackson与MongoDB中的字段名一致性问题 我在开发包含boolean类型字段的模型时遇到Jackson自动转换问题:当字段名为isValid时,会被自动转为valid。但业务要求该字段存入MongoDB时必须保留isValid原名。
尝试使用@Field("isValid")无效,还导致@JsonProperty("isValid")失效;单独使用@JsonProperty("isValid")时,Jackson序列化/反序列化能正常使用isValid字段,但存入MongoDB时仍会变成valid。
我的POJO代码如下:
@Data @ToString public class Response { private String duration; private String time; @JsonProperty("isValid") @Field("isValid") private boolean isValid; }
期望MongoDB存储的文档:
{ "duration": "313610236", "isValid": false, "time": "1658304521794" }
实际存储的文档:
{ "duration": "313610236", "valid": false, "time": "1658304521794" }
请问如何同时保证Jackson序列化/反序列化使用isValid字段,且MongoDB中也以isValid字段存储?
解决方案
方法1:调整字段命名+双注解配合
将字段名改为valid,通过@JsonProperty("isValid")控制Jackson的序列化/反序列化字段名,@Field("isValid")指定MongoDB的存储字段名,规避Jackson对isXXX格式字段的自动转换逻辑:
@Data @ToString public class Response { private String duration; private String time; @JsonProperty("isValid") @Field("isValid") private boolean valid; }
方法2:禁用MongoDB字段自动转换
若坚持保留isValid字段名,可通过配置关闭MongoDB对布尔字段的自动命名转换。在Spring Boot项目中,添加以下配置类:
@Configuration public class MongoConfig { @Bean public MappingMongoConverter mappingMongoConverter(MongoDbFactory mongoDbFactory, MongoMappingContext context) { DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory); MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, context); // 禁用字段名自动转换规则 converter.setFieldNamingStrategy(FieldNamingStrategy.DEFAULT); return converter; } }
同时保留@JsonProperty("isValid")确保Jackson的序列化/反序列化正常:
@Data @ToString public class Response { private String duration; private String time; @JsonProperty("isValid") private boolean isValid; }
方法3:Lombok@Accessors配合注解
利用Lombok的@Accessors修改getter/setter命名规则,生成getIsValid()而非getValid(),让Jackson识别对应isValid字段,同时用@Field指定MongoDB存储名:
@Data @ToString @Accessors(fluent = true) public class Response { private String duration; private String time; @JsonProperty("isValid") @Field("isValid") private boolean isValid; }
内容的提问来源于stack exchange,提问作者Sivvie Lim

