Я новичок в использовании JAXB, и я использовал xjc JAXB 2.1.3 для создания набора классов из моей схемы XML. Помимо создания класса для каждого элемента в моей схеме, он создал класс ObjectFactory.
Кажется, что ничего не мешает мне напрямую создать экземпляры элементов, например
MyElement element = new MyElement();
тогда как учебники, кажется, предпочитают
MyElement element = new ObjectFactory().createMyElement();
Если я загляну в ObjectFactory.java, я вижу:
public MyElement createMyElement() {
return new MyElement();
}
так в чем дело? Зачем мне вообще заморачиваться с классом ObjectFactory? Я предполагаю, что он также будет перезаписан, если я буду перекомпилировать из измененной схемы.
Ответы:
Обратная совместимость - не единственная причина. :-П
С более сложными схемами, такими как те, которые имеют сложные ограничения на значения, которые может принимать содержимое элемента, иногда вам нужно создать реальные
JAXBElement
объекты. Их обычно нетривиально создать вручную, поэтомуcreate*
всю тяжелую работу за вас сделают методы. Пример (из схемы XHTML 1.1):Вот как вы добавляете
<style>
тег в<head>
тег:Первые три использования
ObjectFactory
можно считать излишними (хотя и полезными для согласованности), но четвертое делает использование JAXB намного проще. Визуализации приходитьсяnew JAXBElement
каждый раз писать от руки!источник
Как отметил @Chris, иногда JAXB не может работать с POJO, потому что схема не может быть точно отображена на 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 :
источник