XSD To Java Object (JAXB Plugin)

De Wiki do Leitão
Revisão de 18h47min de 28 de agosto de 2023 por Rodrigogml (discussão | contribs)
Ir para: navegação, pesquisa

É possível utilizar o Java para gerar Objetos que representam as informações usados em um WebService.

Para criar esses objetos vamos precisar primeiro dos arquivos XSD do webservice. De posse dos XSD devemos coloca-los em alguma pasta dentro do projeto, mesmo que temporariamente, para que a IDE possa encontra-lo.

Agora basta seguir os passos abaixo:


1. Clique com o botão direito, no menu Generate > JAXB Classes... para abrir o wizard.

XSDToJava1.jpg


2. Escolha o projeto onde as classes geradas devem ser colocadas

XSDToJava2.jpg


3. Na tela seguinte defina o package que deseja colocar as classes e clique em Finish.

XSDToJava3.jpg


Stop 256.png
Escolha o Pacote com Cuidado
Dependendo das definições do XSD o JAXB cria sua estrutura utilizando o JAXBElement, e um factory para criar os objetos sob demanda. Caso seja feito um refactory os objetos podem parar de funcionar com um erro completamente distorcido como NumberFormatException.


Para os serviços da NFe, recomendo que para cada XSD gerado se crie um pacote separado para esses arquivos mesmo que muitos arquivos possam ser reaproveitados (por serem o mesmo tipo internamente). Acredito que seja melhor ter alguns arquivos repetidos do que conflitos futuros por versões diferentes dos serviços publicados da SEFAZ.


Note 64.png
Falta do @XMLRootElement()
Ao criar os objetos a partir do XSD da SEFAZ, o JAXB não inclui a annotation de identificação do objeto raíz nos elementos necessários por conta da estrutura com o XSD da SEFAZ foi montado.

Para solucionar isso, em cada objeto que representa uma tag raiz de algum serviço é necessário incluir a annotation manualmente para que o JAXB consiga serializar/desserializar o XML corretamente.

Exemplo: na Classe TEnviNFe, que representa a tag enviNFe utilizada no serviço de envio de NFe para autotização, é necessário adicionar a seguinte annotation à classe:

@XmlRootElement(name = "enviNFe")