使用JsonItemReader与JacksonJsonObjectReader时遭遇UnrecognizedPropertyException
问题分析与解决方案
你遇到的问题本质是Lombok生成的getter/setter没有被Jackson正确识别,而非缺少核心Jackson配置,但可以通过调整Jackson或Lombok的配置彻底解决,不用手动添加@JsonProperty注解或编写getter/setter方法。
核心原因
Lombok的@Data注解默认生成符合JavaBean规范的getter/setter(比如字段id对应getId()/setId()),但Spring Batch的JsonItemReader使用的ObjectMapper实例可能被Spring容器自定义过,导致Jackson没有自动识别Lombok生成的方法,或者存在字段名与反序列化规则不匹配的情况。
可行的配置方案
方案1:配置Jackson自动识别Lombok方法
方式A:通过配置文件全局生效
在Spring Boot项目的application.yml或application.properties中添加Jackson可见性配置:
spring: jackson: visibility: field: any getter: any setter: any
或者properties格式:
spring.jackson.visibility.field=any spring.jackson.visibility.getter=any spring.jackson.visibility.setter=any
该配置会让Jackson忽略JavaBean规范的严格检查,直接访问类字段或识别Lombok生成的方法。
方式B:为Spring Batch注入自定义ObjectMapper
如果Spring Batch使用的ObjectMapper是独立实例,可以手动配置并注入:
@Configuration public class BatchConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); // 允许Jackson访问私有字段及Lombok生成的getter/setter objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); objectMapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.ANY); objectMapper.setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.ANY); return objectMapper; } @Bean public JsonItemReader<CustomerDTO> jsonItemReader(ObjectMapper objectMapper) { return new JsonItemReaderBuilder<CustomerDTO>() .resource(new ClassPathResource("customers.json")) .jsonObjectReader(new JacksonJsonObjectReader<>(CustomerDTO.class) .withObjectMapper(objectMapper)) // 注入自定义ObjectMapper .name("customerJsonItemReader") .build(); } }
方案2:调整Lombok配置确保方法命名匹配预期
在项目根目录创建lombok.config文件,添加以下配置:
lombok.accessors.chain=true lombok.accessors.fieldprefix=
该配置确保Lombok生成的getter/setter严格匹配字段名,避免因命名规则差异导致Jackson无法识别。
验证要点
- 确认项目已引入
lombok和jackson-databind依赖(Spring Boot项目通常会自动引入) - 通过IDE反编译功能检查
CustomerDTO类,确认@Data注解已正确生成getter/setter方法
内容的提问来源于stack exchange,提问作者Raymond Nathan
相关产品推荐
相关产品推荐

