В чем смысл классов ObjectFactory JAXB 2?



Я новичок в использовании JAXB, и я использовал xjc JAXB 2.1.3 для создания набора классов из моей XML-схемы. В дополнение к созданию класса для каждого элемента в моей схеме, он создал класс ObjectFactory.



кажется, ничто не мешает мне создавать экземпляры элементов напрямую, например



MyElement element = new MyElement();


в то время как учебники предпочитают



MyElement element = new ObjectFactory().createMyElement();


Если я смотрю в ObjectFactory.Ява, я вижу:



public MyElement createMyElement() {
return new MyElement();
}


Так в чем же дело? Почему я должен даже беспокоиться о сохранении класса ObjectFactory? Я предполагаю, что он также будет перезаписан, если я буду повторно компилироваться из измененной схемы.

644   3  

3 ответов:

обратная совместимость не единственная причина. :- P

С более сложными схемами, такими как те, которые имеют сложные ограничения на значения, которые содержимое элемента может взять на себя, иногда вам нужно создать фактический JAXBElement объекты. Они обычно не тривиальны для создания вручную, поэтому create* методы делают тяжелую работу за вас. Пример (из схемы XHTML 1.1):

@XmlElementDecl(namespace = "http://www.w3.org/1999/xhtml", name = "style", scope = XhtmlHeadType.class)
public JAXBElement<XhtmlStyleType> createXhtmlHeadTypeStyle(XhtmlStyleType value) {
    return new JAXBElement<XhtmlStyleType>(_XhtmlHeadTypeStyle_QNAME, XhtmlStyleType.class, XhtmlHeadType.class, value);
}

вот как вы получаете <style> в теге <head> тег:

ObjectFactory factory = new ObjectFactory();
XhtmlHtmlType html = factory.createXhtmlHtmlType();
XhtmlHeadType head = factory.createXhtmlHeadType();
html.setHead(head);
XhtmlStyleType style = factory.createXhtmlStyleType();
head.getContent().add(factory.createXhtmlHeadTypeStyle(style));

первые три использования ObjectFactory можно считать излишним (хотя и полезным для согласованности), но четвертый делает JAXB намного, намного проще в использовании. Изображение должно написать new JAXBElement из рук каждый раз!

как отметил @Chris, иногда JAXB не может работать с POJOs, потому что схема не может быть точно отображена на Java. В этих случаях JAXBElement объекты-оболочки необходимы для предоставления дополнительной информации о типе.

есть два конкретных примера, с которыми я столкнулся, где это распространено.

  • если вы хотите маршал объект класса, который не имеет @XmlRootElement Примечание. По умолчанию XJC генерирует только @XmlRootElement для некоторых элементов, а не для других. Точная логика для этого немного сложна, но вы можете заставить XJC генерировать больше @XmlRootElement занятия с использованием "простой режим привязки"

  • когда ваша схема использует группы подстановок. Это довольно продвинутое использование схемы, но XJC переводит группы подстановок в Java, интенсивно используя JAXBElement фантики.

так что в XJC-генерируемой объектной модели, которая интенсивно использует JAXBElement (для независимо от причины), вам нужен способ построения этих JAXBElement экземпляров. Сгенерированный ObjectFactory это, безусловно, самый простой способ сделать это. Ты можете построить их самостоятельно, но это неуклюжий и подвержен ошибкам, чтобы сделать это.

обратная совместимость, я думаю ...

http://weblogs.java.net/blog/kohsuke/archive/2005/08/a_story_of_migr.html:

...Нет больше ObjectFactory.createXYZ. Проблема с этими заводскими методами было ли это, что они бросают проверенный JAXBException. Теперь вы можете просто сделать новый XYZ (), больше нет блоков try/catch. (Я знаю, я знаю ... это один из те "о чем мы думали!?" вещи.)..

Comments

    Ничего не найдено.