Отображение аннотированных классов JAXB в CSV (или в общий формат)

#java #xml #csv #jaxb

#java #xml #csv #jaxb

Вопрос:

У меня есть определенное количество аннотированных классов JAXB, сгенерированных из некоторого DTD, которые позволяют мне преобразовывать объекты в xml и xml в объекты совершенно автоматическим способом. Эти XML отправляются в некоторые удаленные службы, предоставленные нам некоторыми поставщиками. Затем другие xml-файлы возвращаются и анализируются в объекты нашего домена.

Процесс подачи заявки выглядит примерно так

  • Обрабатывать объекты домена
  • Сопоставьте их с объектами JAXB
  • Переведите их в xml с помощью jaxb marshaller.

Обратный поток, который преобразует полученные XML-файлы в объекты JAXB, а затем в объекты домена, аналогичен.

Сопоставление между объектами домена и объектами JAXB не является автоматическим: поля и структура отличаются. Итак, в этом есть некоторая логика.

Теперь поставщик попросил нас предоставить файлы CSV вместо файлов XML. Это проблема, потому что мы не хотим дублировать логику отображения. Итак, мы хотели бы повторно использовать объекты JAXB (и, возможно, их аннотации).

Мы также хотели бы избежать выполнения процесса в 2 этапа, такого как генерация xml, а затем перевод его в CSV, если это возможно (и так для обратного процесса).

Есть ли способ «автоматически» отображать объекты в CSV с использованием объектов JAXB (т. Е. Аннотаций JAXB)? Чтобы было понятнее, вершиной было бы сохранение имен xml-тегов в столбцах csv.

В противном случае, как мы можем решить это каким-то элегантным способом?

ПРИМЕЧАНИЕ. Я знаю, как отображать классы Java в столбцы csv. Что я имею в виду под «элегантным», так это то, что без перезаписи новых классов отображения или, возможно, без необходимости изменять отображение данных. Например, с помощью ObjectMapper в Jackson-dqataformat-text возможно преобразование данных, но в этом случае я должен использовать имена полей объектов Java, а не отображенные поля, используемые в xml

Спасибо за поддержку

Ответ №1:

это невозможно. JAXB (привязка Jakarta XML) облегчает сопоставление между xml и Java. это позволяет конвертировать объект Java в xml и xml в объект Java. следовательно, невозможно использовать эту платформу для преобразования объекта Java в CSV. для получения дополнительной информации

но для вашего требования есть другая поддержка фреймворка, преобразующая java object в csv. opencsv — лучшая библиотека для работы с csv на Java.для получения дополнительной информации.

следующий пример связан с opencsv.

Person.java

 public class Person {
    
    @CsvBindByPosition(position = 0)
    private int id;
    @CsvBindByPosition(position = 1)
    private String name;
    
    public Person(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    
    public int getId() {
        return id;
    }
    public String getName() {
        return name;
    }
}
  

преобразовать список пользователей в csv

 try {
    FileWriter writer = new  FileWriter("output.csv");
  
    List<Person> listPerson = new ArrayList<Person>();
    listPerson.add(new Person(1, "Test One"));
    listPerson.add(new Person(2, "Test Two"));
  
    ColumnPositionMappingStrategy mappingStrategy=  new ColumnPositionMappingStrategy();
    mappingStrategy.setType(Person.class);
  
    StatefulBeanToCsvBuilder<Person> builder= new StatefulBeanToCsvBuilder(writer);
    StatefulBeanToCsv beanWriter =  builder.withMappingStrategy(mappingStrategy).build();
  
    beanWriter.write(listPerson);
    writer.close();
            
} catch (Exception e) {
    e.printStackTrace();
}
  

вывод,

 1, Test One
2, Test Two
  

добавьте в свой проект следующие зависимости,

  • opencsv
  • commons-beanutils
  • commons-коллекции
  • commons-lang3
  • commons-ведение журнала

Комментарии:

1. Я знаю это, хорошее решение, а также использование текста формата данных Джексона. github.com/FasterXML/jackson-dataformats-text . Я хотел повторно использовать аннотации jaxb, потому что они описывают поля с одинаковыми именами. Таким образом, либо мне нужно скомпилировать аннотации для каждого класса (а их много), либо я отправляю / получаю данные, сопоставленные с именем полей Java, т. Е. меняю свой контракт. Вот почему я спрашиваю. Но для m важно иметь «окончательный» ответ на эту тему. Кажется, ответа НЕТ, но я немного подожду