diff --git a/csv/src/main/java/tools/jackson/dataformat/csv/CsvParser.java b/csv/src/main/java/tools/jackson/dataformat/csv/CsvParser.java index 6b6429a6..809cc393 100644 --- a/csv/src/main/java/tools/jackson/dataformat/csv/CsvParser.java +++ b/csv/src/main/java/tools/jackson/dataformat/csv/CsvParser.java @@ -655,15 +655,17 @@ protected void _readHeaderLine() throws JacksonException { _reportCsvReadError("Empty header line: can not bind data"); } } - // [dataformats-text#285]: Are we missing something? - int diff = schemaColumnCount - newColumnCount; - if ((diff > 0) && CsvReadFeature.FAIL_ON_MISSING_HEADER_COLUMNS.enabledIn(_formatFeatures)) { + + if (CsvReadFeature.FAIL_ON_MISSING_HEADER_COLUMNS.enabledIn(_formatFeatures)) { Set oldColumnNames = new LinkedHashSet<>(); _schema.getColumnNames(oldColumnNames); oldColumnNames.removeAll(newSchema.getColumnNames()); - _reportCsvReadError(String.format("Missing %d header column%s: [\"%s\"]", - diff, (diff == 1) ? "" : "s", - String.join("\",\"", oldColumnNames))); + var diff = oldColumnNames.size(); + if (diff > 0) { + _reportCsvReadError(String.format("Missing %d header column%s: [\"%s\"]", + diff, (diff == 1) ? "" : "s", String.join("\",\"", oldColumnNames) + )); + } } // otherwise we will use what we got diff --git a/csv/src/test/java/tools/jackson/dataformat/csv/deser/MissingColumns579Test.java b/csv/src/test/java/tools/jackson/dataformat/csv/deser/MissingColumns579Test.java new file mode 100644 index 00000000..9604696b --- /dev/null +++ b/csv/src/test/java/tools/jackson/dataformat/csv/deser/MissingColumns579Test.java @@ -0,0 +1,50 @@ +package tools.jackson.dataformat.csv.deser; + +import org.junit.jupiter.api.Test; +import tools.jackson.databind.MappingIterator; +import tools.jackson.dataformat.csv.CsvMapper; +import tools.jackson.dataformat.csv.CsvReadException; +import tools.jackson.dataformat.csv.CsvSchema; +import tools.jackson.dataformat.csv.ModuleTestBase; + +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.fail; + +/** + * Tests for cases where csv doesn't contain columns from predefined schema + */ +public class MissingColumns579Test extends ModuleTestBase +{ + /* + /********************************************************************** + /* Test methods + /********************************************************************** + */ + + private final CsvMapper MAPPER = mapperForCsv(); + private final CsvSchema csvSchema = CsvSchema.builder() + .setUseHeader(true) + .setReorderColumns(true) + .addColumn("name") + .addColumn("age") + .build(); + private final String CSV = "name,agee\nRoger,18\n"; + + // [dataformats-text#579]: fail when predefined schema have the same number + // of columns as the populated, but column names are differs + @Test + public void testFailOnMissingWithReorder() throws Exception + { + try { + MappingIterator> it = MAPPER + .readerFor(Map.class) + .with(csvSchema) + .readValues(CSV); + it.nextValue(); + fail("Should not pass with missing columns"); + } catch (CsvReadException e) { + verifyException(e, "Missing 1 header column: [\"age\"]"); + } + } +}