Search code examples
javaopencsv

OpenCSV memberFieldsToBindTo not working - Java


I am trying to use OpenCSV to parse a CSV file into a list of objects so I can load student data into my Student Team Allocator system.

I have been following this guide under the heading 'Parsing the records into a Java Object'

After some issues with dependencies I have it outputting a list of Student objects, however the CSV columns are not bound to the member fields as they should be. Print test returns null values for every object's fields.

I have two constructors in Student, one that initialises the 3 fields, and one that is empty. I know currently the empty one gets used as removing this one causes InstantiationExceptions in the Student object.

CSVParser Class

public class CSVParser {

private static String CSV_FILE_PATH;

public CSVParser(String CSVPath){
    CSV_FILE_PATH = CSVPath; 

    try (
        Reader reader = Files.newBufferedReader(Paths.get(CSV_FILE_PATH));
    ) {
        ColumnPositionMappingStrategy strategy = new ColumnPositionMappingStrategy();
        strategy.setType(Student.class);
        String[] memberFieldsToBindTo = {"fName", "sName", "stuNumber"};
        strategy.setColumnMapping(memberFieldsToBindTo);

        CsvToBean csvToBean = new CsvToBeanBuilder(reader)
                .withMappingStrategy(strategy)
                .withSkipLines(1)
                .withIgnoreLeadingWhiteSpace(true)
                .build();

        List<Student> Students = csvToBean.parse();

        for (Student s : Students) {
            System.out.println("First Name : " + s.getFirstName());
            System.out.println("Second Name : " + s.getSecondName());
            System.out.println("StudentNo : " + s.getStudentNumber());
            System.out.println("---------------------------");
        }
    } catch (IOException ex) {
        Logger.getLogger(CSVParser.class.getName()).log(Level.SEVERE, null, ex);
    }

  }
}

Student Class

public class Student {

private String fName;
private String sName;
private String stuNumber;
private String skill;
private final String[] skills = {"Planning","Writing","Developing"};

public Student(){

}

public Student(String fName, String sName, String stuNumber) {
    this.fName = fName;
    this.sName = sName;
    this.stuNumber = stuNumber;
}

// Setters
public void setSkill(int skillIndex){
    this.skill = skills[skillIndex];
}

public void setFirstName(String fName){
    this.fName = fName;
}

public void setSecondName(String sName){
    this.sName = sName;
}

public void setStudentNumber(String stuNumber){
    this.stuNumber = stuNumber;
}

// Getters
public String getFirstName(){
    return fName;
}

public String getSecondName(){
    return sName;
}

public String getStudentNumber(){
    return stuNumber;
}

// Save to Database
private void saveStudent(){
    // DBConnect db = new DBConnect();

}
}

The exception caused by non empty constructor

The exception caused by non empty constructor

The print test showing null values in Student fields

The print test showing null values in Student fields

Please let me know how I can make things any clearer,

Thanks.


Solution

  • The names in the column mapping array should respond to the names of the setters rather than the fields themselves. If it can't find a setter that correspond to the name, it can't set the value.