spring批处理 - FlatFileItemReader - 令牌类型为对象
问题描述:
我在第一次使用spring批处理和spring数据jpa。 Spring批处理读取文本文件说aCode,aName,sCode。 我有这些键映射像下面一个POJO,一个按键是另一种类型的对象spring批处理 - FlatFileItemReader - 令牌类型为对象
public class Pojo{
private AnotherObject sCode;
private String aName;
private String aCode;
}
下面是我在BatchConfiguration类读者的。 如何处理这个AnotherObject。 我碰到一个错误说:
所致:org.springframework.beans.NotWritablePropertyException:无效的属性bean类[POJO的]的“SCODE”:重复匹配找到该场所在输入键距离< = 5:[ “SCODE”, “ACODE”, “aName”。 (考虑减少距离限制或改变输入键名以获得更接近的匹配。)
@Bean
@StepScope
public FlatFileItemReader<Area> reader(
@Value("#{stepExecutionContext[fromId]}") final String fromId,
@Value("#{stepExecutionContext[toId]}") final String toId,
@Value("#{stepExecutionContext[name]}") final String name) {
FlatFileItemReader<Area> reader = new FlatFileItemReader<>();
try{
reader.setResource(new ClassPathResource("area_temp.txt"));
LineMapper<Area> areaMapper = createAreaLineMapper();
reader.setLineMapper(areaMapper);
}
catch(Exception e){
e.printStackTrace();
}
return reader;
}
private LineMapper<Area> createAreaLineMapper() {
DefaultLineMapper<Area> areaLineMapper = new DefaultLineMapper<>();
LineTokenizer areaTokenizer = createAreaTokenizer();
areaLineMapper.setLineTokenizer(areaTokenizer);
FieldSetMapper<Area> areaInformationMapper = createAreaInformationMapper();
areaLineMapper.setFieldSetMapper(areaInformationMapper);
return areaLineMapper;
}
private LineTokenizer createAreaTokenizer() {
DelimitedLineTokenizer areaLineTokenizer = new DelimitedLineTokenizer();
areaLineTokenizer.setDelimiter("|");
areaLineTokenizer.setNames(new String[]{"sCode","aCode","aName"});
return areaLineTokenizer;
}
private FieldSetMapper<Area> createAreaInformationMapper() {
BeanWrapperFieldSetMapper<Area> areaMapper = new BeanWrapperFieldSetMapper<>();
areaMapper.setTargetType(Area.class);
return areaMapper;
}
答
这个例外是非常明显的。 BeanWrapperFieldSetMapper
允许在名称上进行模糊匹配。您可以配置它通过距离的模糊程度。您可以在这里阅读更多有关在javadoc中设置该距离的信息:https://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/file/mapping/BeanWrapperFieldSetMapper.html#setDistanceLimit-int-
感谢您的输入。当pojo和{“sCode”,“aCode”,“aName”}中的名称匹配时,为什么我们应该重写distancelimit?在将其设置为areaMapper.setDistanceLimit(0)后,distancelimit> 5或小于5 – user700
;这个问题已经消失了,但我又收到了另一个错误:“org.springframework.beans.NotWritablePropertyException: ”bean属性'ePCode'的无效属性' setter的参数类型是否与getter的返回类型相匹配?“我确信,AnotherObject拥有公共getter和ePCode的公共setter – user700