FlatFileParseException Parsing error - Spring Batch

13,074

The problem here is that you are missing a default no-arg constructor in your Country class.

You are using BeanWrapperFieldSetMapper to map a FieldSet to an object. Quoting the setTargetType(type) Javadoc:

An object of this type will be created from its default constructor for every call to mapFieldSet(FieldSet).

As such, you need to add a default constructor and provide the corresponding getter / setter for the properties.

Share:
13,074
usil
Author by

usil

Updated on June 23, 2022

Comments

  • usil
    usil almost 2 years

    I follow this tutorial and I'm getting FlatFileParseException error:

    org.springframework.batch.item.file.FlatFileParseException: Parsing error at line: 1 in resource=[class path resource [country.csv]], input=[AA,Aruba]

    country.csv

    AA,Aruba
    BB,Baruba
    

    and here is my ItemReader method

    @Bean
        public ItemReader<Country> reader() {
            FlatFileItemReader<Country> reader = new FlatFileItemReader<Country>();
            reader.setResource(new ClassPathResource("country.csv"));
            reader.setLineMapper(new DefaultLineMapper<Country>() {{
                setLineTokenizer(new DelimitedLineTokenizer() {{
                    setNames(new String[] { "countryCode", "countryName" });
                }});
                setFieldSetMapper(new BeanWrapperFieldSetMapper<Country>() {{
                    setTargetType(Country.class);
                }});
            }});
            return reader;
        }
    

    and Country.java

    @Entity
    @Table(name="Country")
    public class Country  {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id", nullable = false, updatable = false)
        Long id;
    
        @Column(name = "countryCode", nullable = false, updatable = false)
        String countryCode;
    
        @Column(name = "countryName", nullable = false, updatable = false)
        String countryName;
    
        public Country(String countryCode, String countryName) {
            this.countryCode = countryCode;
            this.countryName = countryName;
    
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getCountryCode() {
            return countryCode;
        }
    
        public void setCountryCode(String countryCode) {
            this.countryCode = countryCode;
        }
    
        public String getCountryName() {
            return countryName;
        }
    
        public void setCountryName(String countryName) {
            this.countryName = countryName;
        }
    
        @Override
        public String toString() {
            return "countryCode: " + countryCode + ", countryName: " + countryName;
        }
    }