2017-10-19 4 views
1

J'utilise le printemps et le printemps données jpa dans mon application première fois. Le lot printanier lit un fichier texte: aCode, aName, sCode. J'ai un POJO qui associe ces touches comme ci-dessous, une des clés est d'un autre type d'objetlot de printemps - FlatFileItemReader - jeton est de type objet

public class Pojo{ 
    private AnotherObject sCode; 
    private String aName; 
    private String aCode; 
} 

Ci-dessous mon lecteur en classe BatchConfiguration. Comment gérer ce AnotherObject. je reçois une erreur disant:

Causée par: org.springframework.beans.NotWritablePropertyException: propriété non valide « sCode » de la classe de haricots [Pojo]: correspondance en double avec la distance < = 5 trouvée pour cette propriété dans les clés d'entrée: [ "sCode", "aCode", "aName"]. (Envisagez de réduire la limite de distance ou de modifier les noms des touches de saisie pour obtenir une correspondance plus précise.)

@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; 
} 

Répondre

0

L'exception est assez explicite. BeanWrapperFieldSetMapper permet une correspondance floue sur les noms. Vous pouvez configurer à quel point c'est flou sur la distance. Vous pouvez en savoir plus sur la définition de cette distance dans le javadoc ici: https://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/file/mapping/BeanWrapperFieldSetMapper.html#setDistanceLimit-int-

+0

Merci de votre participation. Pourquoi devrions-nous remplacer le distancelimit, lorsque les noms dans pojo et {"sCode", "aCode", "aName"} correspondent. Si la distancelimit est> 5 ou moins de 5 – user700

+0

après que je l'ai défini à areaMapper.setDistanceLimit (0); Ce problème a disparu mais une autre erreur est survenue: «Provoqué par: org.springframework.beans.NotWritablePropertyException: La propriété 'ePCode' de la classe bean [Pojo] est incorrecte. La propriété Bean 'ePCode' n'est pas accessible en écriture ou possède une méthode setter non valide. Le type de paramètre du setter correspond-il au type de retour du getter? " Je suis sûr, l'AnotherObject a getter public et setter publique pour ePCode – user700