É 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.
2. Escolha o projeto onde as classes geradas devem ser colocadas
3. Na tela seguinte defina o package que deseja colocar as classes e clique em Finish.
|
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.
Além disso, a cada XSD que se criam novos arquivos, muitos se sobrepõe por usarem o mesmo tipo e arquivos de dependências entre os XSDs. Caso alguma alteração/adaptação tenha sido realizada nos objetos criados anteriormente, ela será perdida nos arquivos que forem sobrepostos. Alterações como @XMLRootElement() precisarão serem refeitas.
|
|
|
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")
|
|