Как предотвратить включение CsvMapper нераспознанных полей в выходной CSV? - PullRequest
0 голосов
/ 23 апреля 2019

При использовании CsvMapper с @JsonPropertyOrder все поля, имена которых не указаны явно, помещаются в конец записи CSV.Это означает, что опечатки приводят к другому порядку CSV.

Пример:

public class Example {
  public static void main(String[] args) throws JsonProcessingException {
    final CsvMapper csvMapper = new CsvMapper();
    System.out.println(csvMapper.writerWithSchemaFor(MyClass.class).writeValueAsString(new MyClass("test", true, 2)));
  }

  @Data
  @AllArgsConstructor
  @NoArgsConstructor
  @JsonPropertyOrder({"name", "code"})
  public static class MyClass {

    @JsonProperty("name")
    private String name;

    @JsonProperty("status")
    private boolean status;

    @JsonProperty("code")
    private Integer code;
  }
}

Результат: test,2,true.Поскольку status не было явно указано в @JsonPropertyOrder, оно было помещено в конец записи.Я бы предпочел, чтобы CsvMapper сгенерировал исключение или он вообще не был сериализован.

Другой пример был бы, если бы я изменил @JsonPropertyOrder выше на @JsonPropertyOrder({"name", "stats", "code"}).Обратите внимание на опечатку в stats.Это приведет к тому же CSV, что и выше.

Как настроить CsvMapper на сбой нераспознанных свойств или не сериализовать свойства, не указанные в @JsonPropertyOrder?

1 Ответ

0 голосов
/ 23 апреля 2019

ИМХО единственная цель @JsonPropertyOrder - дать вам возможность определить порядок ваших свойств.Что касается неуказанных полей, вы можете использовать только атрибут alphabetic для управления их порядком.Следовательно, аннотация игнорирует опечатки и просто заботится об известных именах полей, которые вы указали в его атрибуте значения.

Если вам требуется более детальный контроль активных полей для (де) сериализации, вы можете использовать @JsonIgnoreProperties в вашем классе или @JsonIgnore в ваших полях.

Может быть, эта аналогия полезна: рассмотрим оператор SQL - вы SELECT строки в таблицеи ORDER результат, установленный впоследствии.Здесь команда ORDER также не влияет на длину или ширину результирующего набора.

...