пятница, 10 августа 2018 г.

Заставляем дружить CDATA и JAXB

Всем добрый день, сегодня будем говорить о JAXB. Данная технология преобразования объектов в xml файл в java существует достаточно давно и не представляет особой сложности, но как и везде, существует ряд нюансов. Они появляются когда вы хотите сделать, что «нестандартное». В моем случае, требовалось заключить некоторые поля в блок CDATA, а содержимое оставить без изменений.

Давайте расмотрим пример. В его роли будет выступать класс Person. Небольшая ремарка - примеры будут на модном, молодежном kotlin'e 😉

Поле name будет заключено в CDATA. Для этого мы добавили аннотацию java type adapter c собственноручно написанным классом CDATAAdapter. Взглянем на его реализацию:

Можем заметить, что ничего хитрого здесь нет — простые манипуляции со строками. Теперь требует научить сериализатор или про простому маршаллер, не изменять строки которые мы уже модифицировали CDATAAdapter'ом

Если отбросить детали связанные кодировкой и красивым форматированием, то остается параметр выставляющий класс для обработки символов. Здесь мы выставляем свой кастомный обработчик. Что он делает? Его логика проста. Он определяет — если строка ранее была изменена java type адаптером, то исходное значение оставляет без изменений, иначе же — делегирует обработку этой строки встроенному обработчику.

Теперь попробуем запустить данный код и посмотреть на полученный результат:

После выполнения этого кода должна вывестись на экран xml следующего содержания: