O que é JAXB e por que eu deveria usá-lo? [fechadas]
109
Tem cara aqui jurando que JAXB é a coisa mais legal desde o pão fatiado. Estou curioso para ver o que os usuários do Stack Overflow acham que é o caso de uso para JAXB e o que o torna uma solução boa ou ruim para esse caso.
Sou um grande fã de JAXB para manipular XML. Basicamente, ele fornece uma solução para esse problema (estou assumindo familiaridade com XML, estruturas de dados Java e esquemas XML):
Trabalhar com XML é difícil. É necessária uma maneira de pegar um arquivo XML - que é basicamente um arquivo de texto - e convertê-lo em algum tipo de estrutura de dados, que seu programa pode manipular.
JAXB pegará um Esquema XML que você escreve e cria um conjunto de classes que correspondem a esse esquema. Os utilitários JAXB criarão a hierarquia de estruturas de dados para manipular esse XML.
O JAXB pode então ser usado para ler um arquivo XML e, em seguida, criar instâncias das classes geradas - carregadas com os dados de seu XML. JAXB também faz o inverso: pega classes java e gera o XML correspondente.
Eu gosto de JAXB porque é fácil de usar e vem com Java 1.6 (se você estiver usando 1.5, você pode baixar o JAXB .jars.) A maneira como ele cria a hierarquia de classes é intuitiva e, na minha experiência, faz um trabalho decente abstraindo o "XML" para que eu possa me concentrar nos "dados".
Portanto, para responder à sua pergunta: Eu esperaria que, para pequenos arquivos XML, JAXB fosse um exagero. Ele requer que você crie e mantenha um esquema XML e use "métodos de livro-texto padrão" de utilização de classes Java para estruturas de dados. (Classes principais, pequenas classes internas para representar "nós" e uma grande hierarquia deles.) Portanto, JAXB provavelmente não é tão bom para uma lista linear simples de "preferências" para um aplicativo.
Mas se você tiver um esquema XML bastante complexo e muitos dados nele contidos, o JAXB é fantástico. Em meu projeto, eu estava convertendo grandes quantidades de dados entre binários (que eram consumidos por um programa C) e XML (para que humanos pudessem consumir e modificar esses dados). O esquema XML resultante era não trivial (muitos níveis de hierarquia, alguns campos podiam ser repetidos, outros não), então JAXB foi útil para ser capaz de manipular isso.
JAXB é uma especificação (como JPA ou JAXP), o que significa que existem várias implementações (Metro, EclipseLink, etc). Se você tiver problemas com um, pode alternar para outra implementação. Você também pode aproveitar as extensões oferecidas por diferentes fornecedores.
bdoughan
@BlaiseDoughan, Metro é uma implementação JAXB?! Metro não é uma implementação WSIT?
Muhammad Gelbana de
1
@MuhammadGelbana - Acho que deveria me referir a ele como Projeto JAXB ( jaxb.java.net ), que faz parte do Metro a implementação JAX-WS ( metro.java.net ).
Aqui está um motivo para não usá-lo: o desempenho é prejudicado. Há uma boa quantidade de sobrecarga durante o empacotamento e o desempacotamento. Você também pode querer considerar outra API para vinculação de objeto XML - como JiBX:
http://jibx.sourceforge.net/
Considere também o uso da ferramenta XSD2Jibx se estiver tendo problemas com ligações - está no status "alfa", mas é realmente útil ilustrar as classes e ligações que gosta com esquemas XSD ... agora, se apenas parasse de usar data SQL por padrão , e usei o
utilitário
3
Besteira. JAXB é muito rápido, contanto que você use um analisador rápido (como Woodstox), sobrecarga de talvez 30-40% em comparação com a ligação manual. JiBX está bem, sem problemas, mas a diferença de desempenho não é grande.
StaxMan
6
Usei JAXB em vários projetos e continuo a usá-lo. Mas é importante entender como ele se compara a outras estruturas. Se você estiver empacotando / desempacotando documentos com centenas de megabytes, e o tempo é importante - JiBX é uma boa alternativa. JAXB == reflexão, JiBX == instrumentação de código de byte.
codificador de
19
É um "ORM para XML". Mais frequentemente usado junto com JAX-WS (e de fato as implementações da Sun são desenvolvidas juntas) para sistemas WS Death Star.
Eu uso JAXB no trabalho o tempo todo e realmente adoro isso. É perfeito para esquemas XML complexos que estão sempre mudando e especialmente bom para acesso aleatório de tags em um arquivo XML.
Eu odeio ser cafetão, mas acabei de começar um blog e esta é literalmente a primeira coisa que postei!
Não são estruturas de ligação, são bibliotecas de serialização. Uma boa estrutura de ligação pode mapear qualquer XML para um gráfico de objeto isomórfico ou vice-versa. Esses mecanismos de serialização simples produzem e consomem um esquema XML fixo não padrão.
erickson,
Obrigado Erickson, Só trabalhei com JAXB e queria ter certeza de mencionar alternativas. Vou editar minha resposta com base em sua entrada.
Fabian Steeg,
Na verdade, embora o XStream esteja ok, não é realmente mais simples, já que ambos são muito simples. E o Digester NÃO é simples, apenas simplista.
StaxMan
2
Alguém, por favor, mencione JAXB-2.0 usando Anotações. Entre essas e algumas classes XmlAdapter, posso mapear qualquer esquema para qualquer estrutura Java existente.
Mark Renouf,
8
JAXB é ótimo se você precisa codificar para alguma especificação XML externa definida como um esquema XML ( xsd).
Por exemplo, você tem um aplicativo de negociação e deve relatar as negociações ao aplicativo Uber Lame Trade Reporting e eles lhe deram ultra.xsdpara continuar. Use o $JAVA_HOME/bin/xjccompilador para transformar o XML em um monte de classes Java (por exemplo UltraTrade).
Em seguida, você pode simplesmente escrever uma camada de adaptador simples para converter seus objetos de comércio UltraTradese usar o JAXBpara enviar os dados para o Ultra-Corp. Muito mais fácil do que bagunçar a conversão de suas negociações para o formato XML.
Quando tudo falha é quando a Ultra-Corp não obedece de fato suas próprias especificações, e o comércio priceque eles encerram como um xsd:floatdeve ser expresso como um double!
Observe também que você PODE fazer o código primeiro: comece com beans, gere o esquema se precisar.
StaxMan
7
Por que precisamos do JAXB?
Os componentes remotos (escritos em Java) de serviços da web usam XML como um meio para trocar mensagens entre si. Por que XML? Porque XML é considerada uma opção leve para troca de mensagens em redes com recursos limitados. Freqüentemente, precisamos converter esses documentos XML em objetos e vice-versa. Ex: Simple Java POJO Employee pode ser usado para enviar dados de Employee a um componente remoto (também um programa Java).
classEmployee{String name;String dept;....}
Este Pojo deve ser convertido (Marshall) em um documento XML da seguinte forma:
Você também pode verificar o JIBX. É também um excelente fichário de dados xml, especializado em OTA (Open Travel Alliance) e suportado por servidores AXIS2. Se você está procurando desempenho e compatibilidade, pode verificar:
JAXB fornece desempenho aprimorado por meio de otimizações de empacotamento padrão. JAXB define uma API de programador para ler e gravar objetos Java de e para documentos XML, simplificando assim a leitura e a gravação de XML via Java.
Respostas:
Sou um grande fã de JAXB para manipular XML. Basicamente, ele fornece uma solução para esse problema (estou assumindo familiaridade com XML, estruturas de dados Java e esquemas XML):
Trabalhar com XML é difícil. É necessária uma maneira de pegar um arquivo XML - que é basicamente um arquivo de texto - e convertê-lo em algum tipo de estrutura de dados, que seu programa pode manipular.
JAXB pegará um Esquema XML que você escreve e cria um conjunto de classes que correspondem a esse esquema. Os utilitários JAXB criarão a hierarquia de estruturas de dados para manipular esse XML.
O JAXB pode então ser usado para ler um arquivo XML e, em seguida, criar instâncias das classes geradas - carregadas com os dados de seu XML. JAXB também faz o inverso: pega classes java e gera o XML correspondente.
Eu gosto de JAXB porque é fácil de usar e vem com Java 1.6 (se você estiver usando 1.5, você pode baixar o JAXB .jars.) A maneira como ele cria a hierarquia de classes é intuitiva e, na minha experiência, faz um trabalho decente abstraindo o "XML" para que eu possa me concentrar nos "dados".
Portanto, para responder à sua pergunta: Eu esperaria que, para pequenos arquivos XML, JAXB fosse um exagero. Ele requer que você crie e mantenha um esquema XML e use "métodos de livro-texto padrão" de utilização de classes Java para estruturas de dados. (Classes principais, pequenas classes internas para representar "nós" e uma grande hierarquia deles.) Portanto, JAXB provavelmente não é tão bom para uma lista linear simples de "preferências" para um aplicativo.
Mas se você tiver um esquema XML bastante complexo e muitos dados nele contidos, o JAXB é fantástico. Em meu projeto, eu estava convertendo grandes quantidades de dados entre binários (que eram consumidos por um programa C) e XML (para que humanos pudessem consumir e modificar esses dados). O esquema XML resultante era não trivial (muitos níveis de hierarquia, alguns campos podiam ser repetidos, outros não), então JAXB foi útil para ser capaz de manipular isso.
fonte
Aqui está um motivo para não usá-lo: o desempenho é prejudicado. Há uma boa quantidade de sobrecarga durante o empacotamento e o desempacotamento. Você também pode querer considerar outra API para vinculação de objeto XML - como JiBX: http://jibx.sourceforge.net/
fonte
É um "ORM para XML". Mais frequentemente usado junto com JAX-WS (e de fato as implementações da Sun são desenvolvidas juntas) para sistemas WS Death Star.
fonte
Eu uso JAXB no trabalho o tempo todo e realmente adoro isso. É perfeito para esquemas XML complexos que estão sempre mudando e especialmente bom para acesso aleatório de tags em um arquivo XML.
Eu odeio ser cafetão, mas acabei de começar um blog e esta é literalmente a primeira coisa que postei!
Confira aqui:
http://arthur.gonigberg.com/2010/04/21/getting-started-with-jaxb/
fonte
Com JAXB você pode criar automaticamente representações XML de seus objetos (empacotamento) e representações de objeto do XML (descompactação).
No que diz respeito ao esquema XML, você tem duas opções:
Existem também algumas bibliotecas de serialização XML mais simples, como XStream , Digester ou XMLBeans, que podem ser alternativas.
fonte
JAXB é ótimo se você precisa codificar para alguma especificação XML externa definida como um esquema XML (
xsd
).Por exemplo, você tem um aplicativo de negociação e deve relatar as negociações ao aplicativo Uber Lame Trade Reporting e eles lhe deram
ultra.xsd
para continuar. Use o$JAVA_HOME/bin/xjc
compilador para transformar o XML em um monte de classes Java (por exemploUltraTrade
).Em seguida, você pode simplesmente escrever uma camada de adaptador simples para converter seus objetos de comércio
UltraTrades
e usar oJAXB
para enviar os dados para o Ultra-Corp. Muito mais fácil do que bagunçar a conversão de suas negociações para o formato XML.Quando tudo falha é quando a Ultra-Corp não obedece de fato suas próprias especificações, e o comércio
price
que eles encerram como umxsd:float
deve ser expresso como umdouble
!fonte
Por que precisamos do JAXB? Os componentes remotos (escritos em Java) de serviços da web usam XML como um meio para trocar mensagens entre si. Por que XML? Porque XML é considerada uma opção leve para troca de mensagens em redes com recursos limitados. Freqüentemente, precisamos converter esses documentos XML em objetos e vice-versa. Ex: Simple Java POJO Employee pode ser usado para enviar dados de Employee a um componente remoto (também um programa Java).
Este Pojo deve ser convertido (Marshall) em um documento XML da seguinte forma:
E no componente remoto, de volta ao objeto Java do documento XML (Un-Marshall).
O que é JAXB?
JAXB é uma biblioteca ou ferramenta para realizar esta operação de Marshalling e UnMarshalling. Isso o poupa dessa dor de cabeça, simples assim.
fonte
Você também pode verificar o JIBX. É também um excelente fichário de dados xml, especializado em OTA (Open Travel Alliance) e suportado por servidores AXIS2. Se você está procurando desempenho e compatibilidade, pode verificar:
http://jibx.sourceforge.net/index.html
fonte
JAXB fornece desempenho aprimorado por meio de otimizações de empacotamento padrão. JAXB define uma API de programador para ler e gravar objetos Java de e para documentos XML, simplificando assim a leitura e a gravação de XML via Java.
fonte