Весь трюк в том, что вы включаете функцию CsvGenerator.Feature.STRICT_CHECK_FOR_QUOTING . Из документации:
Функция, которая определяет объем работы, выполняемой перед определением того, что для значения столбца требуется заключить в кавычки: при значении true полная проверка выполняется только в тех случаях, когда это строго необходимо;но при значении false выполняется более быстрая, но более консервативная проверка, и, возможно, цитирование используется для значений, которые могут в ней не нуждаться. Компромиссы в основном заключаются между оптимальным / минимальным цитированием (true) и более быстрой обработкой (false). Более быстрая проверка включает в себя только проверку первых N символов значения, а также возможные более слабые проверки.
Тем не менее, обратите внимание, что независимо от настройки все значения, которые должны быть заключены в кавычки, будут следующими: просто при значении false другие значения также могут быть заключены в кавычки (чтобы избежать необходимости делать более дорогие проверки).
Значение по умолчанию - false для «свободной» (приблизительной, консервативной) проверки.
Все остальные конфигурации для схемы и преобразователя можно удалить, и они будут работать аналогичным образом. Вы можете упростить его до следующего кода:
class CsvEntityGenerator {
private final CsvMapper mapper;
private final CsvSchema schema;
public CsvEntityGenerator(Class clazz) {
mapper = new CsvMapper();
mapper.enable(CsvGenerator.Feature.STRICT_CHECK_FOR_QUOTING);
schema = mapper.schemaFor(clazz).withNullValue("");
}
public String toCsvString(Object entity) throws IOException {
return mapper.writer(schema).writeValueAsString(entity);
}
}
И простое использование:
CsvEntityGenerator gen = new CsvEntityGenerator(EntityCsvRecord.class);
System.out.print(gen.toCsvString(new EntityCsvRecord("Na,me")));
System.out.print(gen.toCsvString(new EntityCsvRecord(null)));
System.out.print(gen.toCsvString(new EntityCsvRecord("Name")));
Отпечатки:
8b572b1b-17c1-429d-887b-ec9af1c30d05,"Na,me",SOMETHING,123456,www.some.url
e86eacb1-d45e-4614-91bb-45f0d8840ea9,,SOMETHING,123456,www.some.url
e9627c32-6736-44a5-8eb2-7d153f86af20,Name,SOMETHING,123456,www.some.url
Как видите, мы создаем CsvMapper
и CsvSchema
только один раз и повторно используем его, когда мы хотим сериализовать сущности. Это гораздо более быстрый подход.