Отправка устаревших JavaBeans через HTTP

1

У нас есть компоненты устаревшей системы, работающей в приложении, которое содержит встроенный HTTP-сервер Jetty. Эта унаследованная система имеет несколько JavaBeans (DTO), которые содержат информацию, необходимую нашим HTTP-клиентам. Эти бобы не имеют каких-либо аннотаций для сериализации JSON/XML, и мы не хотим вносить какие-либо изменения в устаревший системный код. Мы также не хотим, чтобы какие-либо зависимости наших клиентов к старой устаревшей системе или ее JavaBeans.

Наконец, эти бобы имеют множество сложных ссылок друг на друга и коллекций друг друга. График объектов некоторых компонентов имеет циклы и нетривиальное наследование, поэтому простая сериализация для JSON или XML взрывается с ошибками цикла.

Я ищу предложения для хорошего способа сделать это.

Одна из идей - описать все эти компоненты в XSD и использовать их для генерации новых классов с требуемыми аннотациями JAXB для сериализации в JSON/XML. Мы вручную собираем структуру объектов с этими новыми компонентами из экземпляра структуры объектов из унаследованной системы, а затем можем отправлять ее по HTTP клиентам только с зависимостью от наших новых классов. Но это похоже на много работы.

Другая идея заключается в подклассе каждого из старых компонентов, чтобы добавить необходимые аннотации XML/JSON JAXB. Это может быть проще, чем писать XSD?? Но нам все равно нужно собрать новый граф объектов экземпляра компонента из графа объектов устаревших компонентов. И у него будет зависимость времени выполнения от клиента с устаревшими JavaBeans.

Я искал некоторые из них, которые автоматически генерируют XSD из существующих классов Java. Похоже, для этого есть некоторые инструменты, но для этого потребуется изменить XSD, поэтому при создании новых классов у него будут требуемые аннотации.

Есть ли способ лучше?

Теги:
rest
jaxb

1 ответ

2
Лучший ответ

JAXB не требует аннотаций. Он может быть настроен извне.

Рассмотрим: http://blog.bdoughan.com/2010/12/extending-jaxb-representing-annotations.html

Кроме того, я нашел для многих случаев, по умолчанию (т.е. Никакие аннотации) работают очень хорошо. Таким образом, у вас, вероятно, не будет большой нагрузки на загрузочный ремень, который вы кодируете.

Если у вас есть общий "корневой" объект, который вы используете, один XmlRootElement запускает весь движок, и даже это не требуется полностью.

Вам нужно быть осторожным с циклическими графами в ваших компонентах, но их можно также управлять с помощью JAXB.

  • 0
    Сама спецификация JAXB (JSR-222) не охватывает внешние метаданные. Мы предлагаем внешний картографический документ в EclipseLink JAXB (MOXy), описанный ссылкой в вашем ответе. Ссылочная реализация JAXB предлагает эту возможность, используя Annox: confluence.highsource.org/display/ANX/JAXB+User+Guide
  • 0
    Спасибо за информацию. Если я правильно понимаю, другой вариант - написать XML для каждого устаревшего компонента, который заменит аннотации. Со времени публикации я узнал, что могу использовать реализацию Eclipse и JAXB по умолчанию для генерации файлов Schema для всех устаревших компонентов. Я предполагаю, что это даст нам 90% пути к желаемым XSD, и нам просто нужно добавить немного дополнительных вещей в XSD для таких вещей, как имена пользовательских пакетов и остановка циклических ссылок. Хотелось бы избежать фазы сборки, но не уверен, что это возможно, без добавления зависимости клиента от устаревших компонентов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню