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

Java Spring中@JsonProperty与@Field注解协同失效问题及解决诉求

问题:Boolean字段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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 10:45:32