Process XML file via JAXB
Генерируем из XSD схемы Java-классы
Скачайте патч в проект (корень или сделать подкаталог patch) и правой кнопкой мыши -> Apply Patch:
Apply patch 3_jaxb_generate.patch
Код проекта менять нельзя, он обновляется только патчами,
иначе следующие патчи не смогут примениться без конфликта!
- Проверяем/подключаем в IDEA "Jakarta EE: Web Services (JAX-WS) plugin" (перезапускаем IDEA)
-
Генерируем из XSD схемы Java-классы: Tools | XML Actions | Generate Java Code From XML Schema Using JAXB
(если будуте делать самостоятельно, классы уже есть в проекте)
- Output path: ..\src\main\java
- Package prefix: ru.javaops.docjava.schema
- Добавляем:
- Jakarta XML Binding реализацию.
Она включает в себя
bind-api
- Lombook
- LocalDateTimeXmlAdapter
- Jakarta XML Binding реализацию.
Она включает в себя
- Подчищяем классы
ru.javaops.docjava.schema
JAXB unmarshalling (десериализация)
Apply patch 4_jaxb_unmarshal.patch
- Добавляем общий класс
JaxbUnmarshaller
(его можно использовать в своих приложениях без изменений) и специфичный для нашей схемыJaxbUtil
- Десериализуем XML в полученные из схемы Java-классы:
mvn test shell:>jaxb -i in/usersWithMeals.xml -o out/jaxb.xml shell:>jaxb -i in/badXmlFile.xml -o out/jaxb.xml
Тестирование
Apply patch 5_jaxb_test.patch
- Добавляем тестовые данные
TestData
и конструкторы@AllArgsConstructor
в схемы - Делаем тест на хороший и плохой XML:
JaxbUtilTest
mvn test
Обработка Filter params
Apply patch 6_jaxb_filter.patch
- Парсим параметры в классе
Util
. Пример параметров:startDate=2023-01-30 - еда с этой даты попадает в вывод endDate=2023-01-30 - еда до этой даты включительно попадает в вывод startTime=11:00 - еда с этого времени попадает в вывод endTime=19:00 - еда строго до этого времени попадает в вывод
-
Фильтруем еду с подсчетом превышения калорий за день для каждого пользователя:
MealsUtil
(функционал с подробным описанием можно посмотреть в демо-приложении стажировки TopJava) - Добавляем метод
JaxbUtil.process
, где будет вся JAXB обработка. - Правим
TestData
(в еду добавляется превышение калорий за деньMeal.excess
и список еды с фильтрацием будет отличаться) - Добавляем тест на фильтрацию
mvn test
JAXB marshalling (сериализация)
Apply patch 7_jaxb_marshal.patch
- Добавляем общие утильные классы
JaxbMarshaller
иJaxbParser
- Десериализуем пользователей через
JaxbParser
- Сериализуем пользователей в output XML в
JaxbUtil.process
- Создаем каталог для результирующих докуменотов (git не работает с каталогами, нужен placeholder)
- Запускаем тесты и приложение и проверяем результат в каталоге out:
mvn test shell:>jaxb -i in/usersWithMeals.xml -o out/jaxb.xml shell:>jaxb -i in/usersWithMeals.xml -f startDate=2023-01-30,endDate=2023-01-30,startTime=11:00,endTime=19:00 -o out/jaxbFiltered.xml