2017-10-19 47 views
1

我在第一次使用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; 
} 

回答

0

這個例外是非常明顯的。 BeanWrapperFieldSetMapper允許在名稱上進行模糊匹配。您可以配置它通過距離的模糊程度。您可以在這裏閱讀更多有關在javadoc中設置該距離的信息:https://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/file/mapping/BeanWrapperFieldSetMapper.html#setDistanceLimit-int-

+0

感謝您的輸入。當pojo和{「sCode」,「aCode」,「aName」}中的名稱匹配時,爲什麼我們應該重寫distancelimit?在將其設置爲areaMapper.setDistanceLimit(0)後,distancelimit> 5或小於5 – user700

+0

;這個問題已經消失了,但我又收到了另一個錯誤:「org.springframework.beans.NotWritablePropertyException: 」bean屬性'ePCode'的無效屬性' setter的參數類型是否與getter的返回類型相匹配?「我確信,AnotherObject擁有公共getter和ePCode的公共setter – user700