Использование пользовательской ObjectFactory с JAXB: есть ли установленный шаблон перехода?
Я понимаю что ObjectFactory
часто генерируется автоматически при работе с JAXB, так как сначала можно определить схему и XML. Однако я не могу подходить к проекту.
У меня есть существующий код, который необходимо аннотировать и расширить для использования JAXB, чтобы затем использовать его вместе со службой REST. У меня есть только несколько классов, и они уже аннотированы. Насколько я понял документацию (я новичок в JAXB), мне нужна реализация ObjectFactory
либо пакетом для автоматического вызова на уровне пакета, либо множеством реализаций, когда на них ссылаются непосредственно, а не ссылаются на контекст пакета.
Я немного не уверен, какой будет лучший подход. Если бы я использовал одну реализацию для каждого пакета, менеджер был бы довольно абстрактным, создавая множество классов. Однако я не уверен, что это "правильный" способ сделать это. Я бы лично решил разделить заботы об инстанциации на отдельные случаи ObjectFactory
то есть иметь одну фабрику на класс. Следовательно, я бы реализовал нечто подобное шаблону объекта доступа к данным.
Мой инженерный опыт говорит мне, что разделение интересов и выбор расширения вместо модификации будет лучшим выбором. Следовательно, моя интуиция говорит мне, что монолитный ObjectFactory
используется только тогда, когда создается в результате подхода, начинающегося с XML, а не кода. Но у меня недостаточно опыта, чтобы сделать осознанный выбор.
Я хотел бы спросить вас не только о вашем опыте работы с технологией и рекомендациями (которые будут основаны на мнениях), но и о том, будет ли этот подход вводить какие-либо риски, которые мне не хватает, а также технические ограничения в отношении JAXB, с которыми я мог бы столкнуться, если Я продолжаю свой курс действий. Спасибо!
1 ответ
Создание JAXBContext
на имя пакета
Когда вы создаете JAXBContext
по названию пакета:
JAXBContext jc = JAXBContext.newInstance("com.example.foo");
Реализация JAXB не выполняет сканирование пакетов, поэтому ей необходимо найти в этом пакете что-то, из чего можно извлечь остальную часть модели. Это может быть:
ObjectFactory
класс сcreate
методы, которые ссылаются на модель предметной области. Начальная загрузка этого лучше всего, когда ваша модель генерируется из схемы XMLjaxb.index
файл, который представляет собой простой список коротких имен классов (не указанных в пакете), возвращаемых кареткой, для классов, которые вы хотите загрузитьJAXBContext
на. Это не должен быть полный список, поскольку JAXB будет тянуть ссылочные классы. Лучше всего использовать этот подход, когда вы начинаете с Java classe.
Какие ObjectFactory
используется для
Что касается метаданных, то ObjectFactory
имеет:
create
методы, из сигнатуры которых можно определить модель предметной области (если вы загрузились наObjectFactory
в одиночестве.@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
в любом случае вы хотите.