将JsonItemReader与JacksonJsonObjectReader一起使用时,正在获取com.fasterx



我遇到了spring-batch JsonItemReader的问题,在尝试读取json文件时出现了上述错误。

JsonItemReader配置

@Autowired
private ObjectMapper objectMapper;
@StepScope
@Bean
public JsonItemReader<CustomerDTO> customerItemReader(){
return new JsonItemReaderBuilder<CustomerDTO>()
.jsonObjectReader(new JacksonJsonObjectReader<>(objectMapper,CustomerDTO.class))
.resource(new FileSystemResource(customerFilePath))
.name("jsonCustomerItemReader")
.build();
}
DTO
@Data
public class CustomerDTO {
private int id;
private String firstName;
private String lastName;
private String gender;
private String contactNo;
private String country;
private String dob;
}
Json样品
[
{
"id": 372,
"firstName": "Jessie",
"lastName": "Campos",
"gender": "female",
"contactNo": "(828) 559-3435",
"country": "Poland",
"dob": "2017-04-03T11:15:53 -08:00"
}
]

Stacktrace

如图所示,该错误表示在CustomerDTO对象中找不到id。不确定我为什么会出错。

org.springframework.batch.item.ParseException:无法读取下一个位于的JSON对象org.springframework.batch.item.json.JacksonJsonObjectReader.read(JacksonJson ObjectReader.java:90)~[spring-batch-infrastructure-4.3.7.jar:4.3.7]org.springframework.batch.item.json.JsonItemReader.doRead(JsonItemReader.java:110)~[spring-batch-infrastructure-4.3.7.jar:4.3.7]org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.read(AbstractItemCountdingItemStreamItemReporter.java:93)~[spring-batch-infrastructure-4.3.7.jar:4.3.7]org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader$$FastClassBySpringCGLIB$$ebb633d0.invoke()~[spring-batch-infrastructure-4.3.7.jar:4.3.7]org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)~[弹簧芯-5.3.23.罐子:5.3.23]org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAoProxy.java:793)~[spring-aop-5.3.23.罐子:5.3.23]org.springframework.aop.framework.ReflectiveMethodInvocation.prough(ReflectiveMethodInvocation.java:163)~[spring-aop-5.3.23.罐子:5.3.23]org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.prough(CglibAoProxy.java:763)~[spring-aop-5.3.23.罐子:5.3.23]org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:137)~[spring-aop-5.3.23.罐子:5.3.23]org.springframework.aop.support.DelegatingIntroductionInterceptor.ioke(DelegatingIntroductionInterceptor.java:124)~[spring-aop-5.3.23.罐子:5.3.23]org.springframework.aop.framework.ReflectiveMethodInvocation.prough(ReflectiveMethodInvocation.java:186)~[spring-aop-5.3.23.罐子:5.3.23]org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.prough(CglibAoProxy.java:763)~[spring-aop-5.3.23.罐子:5.3.23]org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.cintercept(CglibAoProxy.java:708)~[spring-aop-5.3.23.罐子:5.3.23]org.springframework.batch.item.json.JsonItemReader$$EnhancerBySpringCGLIB$$299546ea.read()~[spring-batch-infrastructure-4.3.7.jar:4.3.7]org.springframework.batch.core.step.item.SimpleChunkProvider.doRead(SimpleChunkProvider.java:99)~[spring-batch-core-4.3.7.jar:4.3.7]org.springframework.batch.core.step.item.SimpleChunkProvider.read(SimpleChunkProvider.java:180)~[spring-batch-core-4.3.7.jar:4.3.7]org.springframework.batch.core.step.item.SimpleChunkProvider$1.doInIteration(SimpleChunkProvider.java:126)~[spring-batch-core-4.3.7.jar:4.3.7]org.springframework.batch.rerep.support.ReatTemplate.getNextResult(RepeatTemplate.java:375)~[spring-batch-infrastructure-4.3.7.jar:4.3.7]org.springframework.batch.rerep.support.ReatTemplate.executeInternal(RepeatTemplate.java:215)~[spring-batch-infrastructure-4.3.7.jar:4.3.7]org.springframework.batch.rerep.support.ReateTemplate.iiterate(RepeatTemplate.java:145)~[spring-batch-infrastructure-4.3.7.jar:4.3.7]org.springframework.batch.core.step.item.SimpleChunkProvider.fluve(SimpleChunkProvider.java:118)~[spring-batch-core-4.3.7.jar:4.3.7]org.springframework.batch.core.step.item.ChunkOrientedTasklet.exexecute(ChunkOrientedTasklet.java:71)~[spring-batch-core-4.3.7.jar:4.3.7]org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:407)~[spring-batch-core-4.3.7.jar:4.3.7]org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:331)~[spring-batch-core-4.3.7.jar:4.3.7]org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)~[弹簧-tx-5.3.23.罐子:5.3.23]org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:273)~[spring-batch-core-4.3.7.jar:4.3.7]org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:82)~[spring-batch-core-4.3.7.jar:4.3.7]org.springframework.batch.rerep.support.ReatTemplate.getNextResult(RepeatTemplate.java:375)~[spring-batch-infrastructure-4.3.7.jar:4.3.7]org.springframework.batch.rerep.support.ReatTemplate.executeInternal(RepeatTemplate.java:215)~[spring-batch-infrastructure-4.3.7.jar:4.3.7]org.springframework.batch.rerep.support.ReateTemplate.iiterate(RepeatTemplate.java:145)~[spring-batch-infrastructure-4.3.7.jar:4.3.7]org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:258)~[spring-batch-core-4.3.7.jar:4.3.7]org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:208)~[spring-batch-core-4.3.7.jar:4.3.7]org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:152)~[spring-batch-core-4.3.7.jar:4.3.7]org.springframework.batch.core.job.AbstractJob.handleStep(AbstractJob.java:413)~[spring-batch-core-4.3.7.jar:4.3.7]org.springframework.batch.core.job.SimpleJob.doExecute(SimpleJob.java:136)~[spring-batch-core-4.3.7.jar:4.3.7]org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:320)~[spring-batch-core-4.3.7.jar:4.3.7]org.springframework.batch.core.slaunch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:149)~[spring-batch-core-4.3.7.jar:4.3.7]org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)~[弹簧芯-5.3.23.罐子:5.3.23]org.springframework.batch.core.slaunch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:140)~[spring-batch-core-4.3.7.jar:4.3.7]java.base/jdk.internal.reflect.DirectMethodHandleAccessor.ioke(DirectMethodHandleAccessor.java:104)在java.base/java.lang.reflect.Method.ioke(Method.java:578)~[na:na]在org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)~[spring-aop-5.3.23.罐子:5.3.23]org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)~[spring-aop-5.3.23.罐子:5.3.23]org.springframework.aop.framework.ReflectiveMethodInvocation.prough(ReflectiveMethodInvocation.java:163)~[spring-aop-5.3.23.罐子:5.3.23]org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$PassthruAdvice.ioke(SimpleBatchConfiguration.java:128)~[spring-batch-core-4.3.7.jar:4.3.7]org.springframework.aop.framework.ReflectiveMethodInvocation.prough(ReflectiveMethodInvocation.java:186)~[spring-aop-5.3.23.罐子:5.3.23]org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynaticalAopProxy:java:215)~[spring-aop-5.3.23.罐子:5.3.23]jdk.proxy2/jdk.proxy2.$Proxy93.run(未知源)~[na:na]位于org.springframework.boot.autoconfig.batch.JobLauncherApplicationRunner.execute(JobLauncherApplication Runner.java:199)~[spring-boot-autoconfigure-2.7.4.jar:2.7.4]org.springframework.boot.autoconfig.batch.JobLauncherApplicationRunner.executeLocalJobs(JobLauncherApplication Runner.java:173)~[spring-boot-autoconfigure-2.7.4.jar:2.7.4]org.springframework.boot.autoconfig.batch.JobLauncherApplicationRunner.launchJobFromProperties(JobLauncherApplication Runner.java:160)~[spring-boot-autoconfigure-2.7.4.jar:2.7.4]org.springframework.boot.autoconfig.batch.JobLauncherApplicationRunner.run(JobLauncherApplication Runner.java:155)~[spring-boot-autoconfigure-2.7.4.jar:2.7.4]org.springframework.boot.autoconfig.batch.JobLauncherApplicationRunner.run(JobLauncherApplication Runner.java:150)~[spring-boot-autoconfigure-2.7.4.jar:2.7.4]org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:762)~[spring-boot-2.7.4.罐:2.7.4]org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752)~[spring-boot-2.7.4.罐:2.7.4]org.springframework.boot.SpringApplication.run(SpringApplication.java:315)~[spring-boot-2.7.4.罐:2.7.4]org.springframework.boot.SpringApplication.run(SpringApplication.java:1306)~[spring-boot-2.7.4.罐:2.7.4]org.springframework.boot.SpringApplication.run(SpringApplication.java:1295)~[spring-boot-2.7.4.罐:2.7.4]com.example.BatchApplication.main(BatchApplication.java:11)~[classes/:na]原因:com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段";id";(classcom.example.batch.dto.CustomerDTO),而不是在[源:]标记为可忽略(0个已知属性:])(sun.nio.ch.ChannelInputStream);行:3,列:14](通过引用链:com.example.batch.dto.CustomerDTO["id"])com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecgnizedPropertyException.java:61)~[jackson-databind-2.13.4.jar:2.13.4]com.fasterxml.jackson.databind.DDeserializationContext.handleUnknownProperty(Deserialization Context.java:1127)~[jackson-databind-2.13.4.jar:2.13.4]com.fasterxml.jackson.databind.deser.StdDeserializer.handleUnknownProperty(StdDeserialize.java:2023)~[jackson-databind-2.13.4.jar:2.13.4]com.fasterxml.jackson.databind.deser.BBeanSerializerBase.handleUnknownProperty(BeanSerializer Base.java:1700)~[jackson-databind-2.13.4.jar:2.13.4]com.fasterxml.jackson.databind.deser.BBeanSerializerBase.handleUnknownVarilla(BeanSerializer Base.java:1678)~[jackson-databind-2.13.4.jar:2.13.4]com.fasterxml.jackson.databind.deser.BeanSerializer.vanillaDeserialize(BeanSerializer.java:320)~[jackson-databind-2.13.4.jar:2.13.4]com.fasterxml.jackson.databind.deser.BeanSerializer.deserialize(BeanSerializer.java:177)~[jackson-databind-2.13.4.jar:2.13.4]com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserialization Context.java:323)~[jackson-databind-2.13.4.jar:2.13.4]com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:4650)~[jackson-databind-2.13.4.jar:2.13.4]com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2831)~[jackson-databind-2.13.4.jar:2.13.4]org.springframework.batch.item.json.JacksonJsonObjectReader.read(JacksonJson ObjectReader.java:87)~[spring-batch-infrastructure-4.3.7.jar:4.3.7]。。。58个通用框架省略

更新(解决方案)

经过几个小时的调试,似乎如果我不使用lombok@Data注释并生成getter和setter,它就可以工作了。此外,如果我用@JsonProperty(")注释我的DTO,它也可以工作。有没有我缺少的杰克逊的配置?

我的maven编译器插件中似乎缺少了lombok的annotationProcessorPath。在将其更新到以下版本后,可以使用带有lombok的@Data注释的JacksonJsonObjectReader。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>19</source>
<target>19</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${version.mapstruct}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${version.lombok}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${version.mapstruct-lombok}</version>
</path>
</annotationProcessorPaths>
</configuration>

最新更新