2015-06-11 2 views
5

Я использую Jackson CSV для анализа файла CSV в POJO. Моя проблема в том, что если в строке CSV слишком мало столбцов, синтаксический анализатор не жалуется и просто устанавливает остальные поля в нуль.Jackson CSV missing columns

Синтаксический код:

CsvMapper csvMapper = new CsvMapper(); 
    csvMapper.addMixInAnnotations(Person.class, PersonCsvMixin.class); 
    CsvSchema schema = csvMapper.schemaFor(Person.class).withHeader(); 
    MappingIterator<Person> it = csvMapper.reader(dataClass).with(schema).readValues(csv); 
    LinkedList<Person> output = new LinkedList<>(); 

    while(it.hasNext()) { 
     output.push(it.next()); 
    } 

Mixin:

import com.fasterxml.jackson.annotation.*; 

@JsonPropertyOrder(value = { "FirstName", "LastName", "Title"}) 
public abstract class Person { 
    @JsonProperty("LastName") 
    public abstract String getLastName(); 
    @JsonProperty("FirstName") 
    public abstract String getFirstName(); 
    @JsonProperty("Title") 
    public abstract String getTitle(); 
} 

класс данных:

public class OfficespaceInputEmployee implements Serializable{ 
    protected String firstName; 
    protected String lastName; 
    protected String title; 
    // .. getters and setters 
} 

Если я разобрать файл как следующий, никаких ошибок не происходит, даже при том, что средний запись отсутствует два поля. Вместо этого, LastName и титульный стать null

"FirstName", "LastName", "Title" 
"John", "Smith", "Mr" 
"Mary" 
"Peter", "Jones", "Dr" 

Есть ли функция, чтобы позволить, что приведет это к ошибкам, а?

+0

Показать использование MappingIterator. –

+0

@LaurentiuL. добавлено MappingIterator use – rewolf

ответ

3

Вы можете бросить исключение себя, когда вы строите выходной LinkedList внутри в то время цикла:

while(it.hasNext()) { 
    Person line = it.next(); 
    //call a method which checks that all values have been set 
    if (thatMethodReturnsTrue){ 
     output.push(line); 
    } else{ 
     throw SomeException(); 
    } 
} 
+1

Да, спасибо. Я знаю, что могу это сделать, но я надеялся, что библиотека действительно проверит это во время разбора, как это бывает, когда слишком много полей. – rewolf

+0

Я не нашел ни одного варианта, который вы можете передать, чтобы сделать синтаксический анализатор строгим. Я думаю, что может быть не один –

+1

@rewolf был бы полезен для CsvParser.Feature, который можно включить на CsvMapper. Вы можете добавить предложение о github –

2

Я хотел бы предложить подав RFE для отслеживания проблем, что-то вроде CsvParser.Feature.REQUIRE_ALL_COLUMNS: если эта функция включена, анализатор может бросить исключение, указывающее, что отсутствует один или несколько ожидаемых столбцов. Это звучит как полезное дополнение ко мне.

+1

Создан вопрос о Github https://github.com/FasterXML/jackson-dataformat-csv/issues/113 – rewolf

Смежные вопросы