Pra utilizarmos JAXB, uma biblioteca que transforma de XML pra Java e de Java pra XML e que já vem com a JRE, devemos alterar um pouco as coisas.
- O JAXB não funciona bem com imutabilidade. Se quisermos deixar nossa classe
Negociacao
imutável e usá-la com JAXB, devemos:- criar uma versão mutável da classe. Veja a classe
NegociacaoMutavel
, que tem setters e cujos atributos não são final. - criar uma classe que herda de XmlAdapter, fornecendo implementações para o método
marshal
, que transforma deNegociacao
paraNegociacaoMutavel
, e para o métodounmarshal
, que transforma deNegociacaoMutavel
paraNegociacao
. - anotar a classe
Negociacao
com@XmlJavaTypeAdapter(NegociacaoAdapter.class)
- criar uma versão mutável da classe. Veja a classe
- Outra coisa que não funciona bem com o JAXB são listas. Para que possamos ler um XML que tem uma lista de negociações, precisamos criar uma classe que embrulha a lista, como a classe
ListaDeNegociacoes
, que tem um atributolista
do tipoList<Negociacao>.
. Algumas observações:- usamos a anotação
@XmlRootElement(name="list")
para indicar que será o elemento principal do XML e que será chamado de<list></list>
. - usamos também
@XmlAccessorType(XmlAccessType.FIELD)
para indicar que as anotações estão nos atributos e não nos getters (o padrão do JAXB). - anotamos o atributo
lista
com@XmlElement(name="negociacao")
para indicar que, dentro do<list></list>
, as negociações estarão em tags<negociacao></negociacao>
.
- usamos a anotação
- A classe
LeitorXML
tem os seguintes passos:- criamos um
JAXBContext
passando a classeListaDeNegociacoes
, que é nosso elemento principal. - a partir do context criamos um
Unmarshaller
, que será responsável por transformar de XML para Java. - chamamos o método
unmarshal
doUnmarshaller
, recebendo um objeto do tipoListaDeNegociacoes
. - obtemos a
List<Negociacao>
chamando o métodogetLista
daListaDeNegociacoes
.
- criamos um
- A última diferença é o formato da data no XML. É utilizado o formato de datas ISO 8601, que fica algo como
<data>2011-11-25T15:02:24</data>
.