Использование пользовательской ObjectFactory с JAXB: есть ли установленный шаблон перехода?

Я понимаю что ObjectFactory часто генерируется автоматически при работе с JAXB, так как сначала можно определить схему и XML. Однако я не могу подходить к проекту.

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

Я немного не уверен, какой будет лучший подход. Если бы я использовал одну реализацию для каждого пакета, менеджер был бы довольно абстрактным, создавая множество классов. Однако я не уверен, что это "правильный" способ сделать это. Я бы лично решил разделить заботы об инстанциации на отдельные случаи ObjectFactory то есть иметь одну фабрику на класс. Следовательно, я бы реализовал нечто подобное шаблону объекта доступа к данным.

Мой инженерный опыт говорит мне, что разделение интересов и выбор расширения вместо модификации будет лучшим выбором. Следовательно, моя интуиция говорит мне, что монолитный ObjectFactory используется только тогда, когда создается в результате подхода, начинающегося с XML, а не кода. Но у меня недостаточно опыта, чтобы сделать осознанный выбор.

Я хотел бы спросить вас не только о вашем опыте работы с технологией и рекомендациями (которые будут основаны на мнениях), но и о том, будет ли этот подход вводить какие-либо риски, которые мне не хватает, а также технические ограничения в отношении JAXB, с которыми я мог бы столкнуться, если Я продолжаю свой курс действий. Спасибо!

1 ответ

Создание JAXBContext на имя пакета

Когда вы создаете JAXBContext по названию пакета:

JAXBContext jc = JAXBContext.newInstance("com.example.foo");

Реализация JAXB не выполняет сканирование пакетов, поэтому ей необходимо найти в этом пакете что-то, из чего можно извлечь остальную часть модели. Это может быть:

  1. ObjectFactory класс с create методы, которые ссылаются на модель предметной области. Начальная загрузка этого лучше всего, когда ваша модель генерируется из схемы XML
  2. jaxb.index файл, который представляет собой простой список коротких имен классов (не указанных в пакете), возвращаемых кареткой, для классов, которые вы хотите загрузить JAXBContext на. Это не должен быть полный список, поскольку JAXB будет тянуть ссылочные классы. Лучше всего использовать этот подход, когда вы начинаете с Java classe.

Какие ObjectFactory используется для

Что касается метаданных, то ObjectFactory имеет:

  1. create методы, из сигнатуры которых можно определить модель предметной области (если вы загрузились на ObjectFactory в одиночестве.
  2. @XmlElementDecl аннотаций. @XmlElementDecl аннотация похожа на @XmlRootElement аннотации, но используются в корпусе для элементов верхнего уровня, имеющих именованный тип (см.: http://blog.bdoughan.com/2012/07/jaxb-and-root-elements.html).

Какие ObjectFactory не используется для

ObjectFactory не используется во время umarshal операция по созданию экземпляров классов домена. Для получения дополнительной информации см. Вопрос, связанный ниже:

Создание JAXBContext в среде JAX-RS

Вы упомянули, что делаете ОТДЫХ. Если вы используете для этого реализацию JAX-RS (например, Джерси), то я бы предложил использовать ContextResolver создать свой JAXBContext, Ниже приведен пример из моего блога. В этом примере для предоставления метаданных используется расширение в MOXy JAXB impl, но вы можете создать его JAXBContext в любом случае вы хотите.

Другие вопросы по тегам