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
相关产品推荐
相关产品推荐

