Jaxb: Как мне сгенерировать класс ObjectFactory? - PullRequest
7 голосов
/ 22 июня 2011

Я использую Java 6, JaxB 2 и SpringSource Tool Suite (так же, как Eclipse).Я написал пару классов Java, из которых я использовал JaxB для генерации схемы XML.Тем не менее, я заметил, что для того, чтобы использовать способность JaxB генерировать XML-документ из объектов Java, мне нужен ObjectFactory.

final Marshaller marshaller = jaxbContext.createMarshaller();
// Here is where I don't have an ObjectFactory defined
final JAXBElement<WebLeads> webLeadsElement  
         = (new ObjectFactory()).createWebLeads(webLeadsJavaObj);

Как я могу сгенерировать ObjectFactory, не выбрасывая классы, которые у меня уже есть?

Ответы [ 3 ]

11 голосов
/ 22 июня 2011

ОБНОВЛЕНИЕ

Этот вопрос может относиться к роли ObjectFactory в создании JAXBContext.Если вы загрузите JAXBContext в контекстный путь, он проверит наличие ObjectFactory в этом месте, чтобы определить классы в этом пакете:

Если у вас нет ObjectFactory, но вы все еще хотите создать вас JAXBContext по контекстному пути, вы можете включить файл с именем jaxb.index в список файлов этого пакета, который будет включен в JAXBContext (ссылочные классыавтоматически извлекается):

В качестве альтернативы вы можете загрузить JAXBContext в массив классов вместо пути к контексту:

Требуется ли ObjectFactory

ObjectFactory не требуется, хотя даже при запуске из классов Java существуют случаи, когда вы можете использовать аналогичный класс, аннотированный @XmlRegistry для использования аннотации @XmlElementDecl.

Создание экземпляра JAXBElement

Вы всегда можете создать JAXBElement напрямую:

final JAXBElement<WebLeads> webLeadsElement = new JAXBElement<WebLeads>(
    new QName("root-element-name"), 
    WebLeads.class, 
    webLeadsJavaObj);

Альтернатива JAXBElement

Или, поскольку JAXBElement просто используется для предоставления информации о корневом элементе, вы можете аннотировать свой класс WebLeads с помощью @XmlRootElement:

@XmlRootElement(name="root-element-name")
public class WebLeads {
   ...
}
2 голосов
/ 22 июня 2011

Не думаю, что вам нужен ObjectFactory.

Это просто служебный класс, который генерирует XJC, чтобы облегчить жизнь в некоторых случаях.

Edit: Читая ваш вопрос, я думаю, вы создали POJO с аннотациями JAXB вручную.

Рассмотрите возможность добавления XmlRootElement в «корневой» класс: http://download.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlRootElement.html

Вот еще немного информации: Нет @XmlRootElement, сгенерированного JAXB

1 голос
/ 22 июня 2011

Вам не нужна фабрика для работы маршаллера JaxB.Если вы передадите ему объект со списком или переменную карты, он на самом деле сделает это правильно.Это, конечно, верно только в том случае, если вы правильно инициализировали маршаллер JaxB в направлении класса объекта, который хотите маршалировать.

Вы можете создать фабрику, и эта фабрика может создать какой-то специализированный возврат (скажем, вы нене хочу, чтобы он возвращал ваши публичные временные переменные)

...