Eu sou novo no uso do JAXB e usei o xjc do JAXB 2.1.3 para gerar um conjunto de classes do meu esquema XML. Além de gerar uma classe para cada elemento em meu esquema, ele criou uma classe ObjectFactory.
Parece que nada me impede de instanciar os elementos diretamente, por exemplo
MyElement element = new MyElement();
enquanto os tutoriais parecem preferir
MyElement element = new ObjectFactory().createMyElement();
Se eu olhar para ObjectFactory.java, vejo:
public MyElement createMyElement() {
return new MyElement();
}
então qual é o problema? Por que eu deveria me preocupar em manter a classe ObjectFactory por perto? Presumo que também será sobrescrito se eu for recompilar a partir de um esquema alterado.
Respostas:
A compatibilidade com versões anteriores não é a única razão. :-P
Com esquemas mais complicados, como aqueles que têm restrições complicadas nos valores que o conteúdo de um elemento pode assumir, às vezes você precisa criar
JAXBElement
objetos reais . Normalmente, eles não são triviais de criar manualmente, portanto, oscreate*
métodos fazem o trabalho difícil para você. Exemplo (do esquema XHTML 1.1):É assim que você
<style>
transforma uma<head>
tag em uma tag:Os três primeiros usos do
ObjectFactory
podem ser considerados supérfluos (embora úteis para consistência), mas o quarto torna o JAXB muito, muito mais fácil de usar. Imaging tendo que escrever umnew JAXBElement
à mão todas as vezes!fonte
Como @Chris apontou, às vezes JAXB não pode funcionar com POJOs, porque o esquema não pode ser mapeado exatamente para Java. Nesses casos, os
JAXBElement
objetos de invólucro são necessários para fornecer as informações de tipo adicionais.Existem dois exemplos concretos que encontrei em que isso é comum.
Se você deseja empacotar um objeto de uma classe que não possui a
@XmlRootElement
anotação. Por padrão, o XJC gera apenas@XmlRootElement
para alguns elementos e não para outros. A lógica exata para isso é um pouco complicada, mas você pode forçar o XJC a gerar mais@XmlRootElement
classes usando o "modo de ligação simples"Quando seu esquema usa grupos de substituição. Isso é um uso de esquema bastante avançado, mas o XJC traduz grupos de substituição em Java fazendo uso intenso de
JAXBElement
wrappers.Portanto, em um modelo de objeto gerado por XJC que faz uso intenso
JAXBElement
(por qualquer motivo), você precisa de uma maneira de construir essasJAXBElement
instâncias. O geradoObjectFactory
é de longe a maneira mais fácil de fazer isso. Você mesmo pode construí-los, mas é desajeitado e sujeito a erros de fazer.fonte
Compatibilidade com versões anteriores, eu acho ...
http://weblogs.java.net/blog/kohsuke/archive/2005/08/a_story_of_migr.html :
fonte