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

Lombok @Data与@JsonIgnore注解兼容问题求助(Java 8)

Java 8下RESTTemplate请求体忽略字段的有效解决方案

在使用Lombok @Data注解定义PSRequest类时,为dt字段添加@JsonIgnore后,该字段仍出现在RESTTemplate发送的请求体中,且尝试过@Getter(onMethod = @__(@JsonIgnore))、@Getter(onMethod_ = @JsonIgnore)、@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)、类级别@JsonIgnoreProperties({"dt"})等方法均无效。以下是Java 8环境下的针对性解决方案:

1. 校验Jackson与Lombok版本兼容性

Java 8环境下,版本不匹配是注解失效的常见原因:

  • 确保Jackson jackson-databind版本在2.9.x及以上,Lombok版本在1.18.x及以上
  • Maven依赖配置示例:
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.10.8</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.28</version>
        <scope>provided</scope>
    </dependency>
    

2. 禁用字段自动生成的Getter/Setter并配合类级别注解

@Data自动生成的Getter可能覆盖@JsonIgnore的作用,需显式禁用并配合类级别注解双重保障:

@Data
@NoArgsConstructor
@JsonIgnoreProperties({"dt"}) // 类级别指定序列化忽略字段
class PSRequest {
    // 其他变量

    @JsonIgnore
    @Getter(AccessLevel.NONE) // 禁止生成该字段的Getter
    @Setter(AccessLevel.NONE) // 禁止生成该字段的Setter
    java.util.Date dt;
}

3. 自定义RESTTemplate的ObjectMapper配置

确保RESTTemplate使用的ObjectMapper正确识别Jackson注解,同时适配Java 8日期类型:

@Bean
public RestTemplate restTemplate() {
    ObjectMapper objectMapper = new ObjectMapper();
    // 注册Java 8日期模块,解决日期序列化问题
    objectMapper.registerModule(new JavaTimeModule());
    objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    // 强制启用注解驱动的序列化/反序列化
    objectMapper.configure(MapperFeature.USE_ANNOTATIONS, true);

    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(objectMapper);
    RestTemplate restTemplate = new RestTemplate();
    // 替换默认的Jackson消息转换器
    restTemplate.getMessageConverters().removeIf(c -> c instanceof MappingJackson2HttpMessageConverter);
    restTemplate.getMessageConverters().add(converter);
    return restTemplate;
}

4. 手动为Getter添加@JsonIgnore注解

直接重写Getter方法并添加@JsonIgnore,避免Lombok生成的方法覆盖注解:

@Data
@NoArgsConstructor
class PSRequest {
    // 其他变量

    java.util.Date dt;

    @JsonIgnore
    @Override
    public Date getDt() {
        return dt;
    }
}

或使用Lombok的Java 8兼容语法指定Getter注解:

@Data
@NoArgsConstructor
class PSRequest {
    // 其他变量

    @Getter(onMethod_ = @JsonIgnore) // Java 8下使用onMethod_语法
    @Setter
    java.util.Date dt;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:30:18