Gerar Classes Mapeando XML de Entrada
Algumas ferramentas Java, permitem criar classes com base no XSD do arquivo, possibilitando inserir programaticamente os dados necessários a serem repassados para o Web Service.
A aplicação xjc gera as classes Java (POJOs) de acordo com o XML Schema definido. Assim como o wsimport, o xjc é uma ferramenta nativa do JDK 1.6 e pode ser utilizado diretamente do pacote do JAXB em versões anteriores.
Ex.: xjc -p br.gov.serpro.siscomex.carga.modelws.cargadescarga boletim-carga-descarga.xsd
Os objetos gerados serão preenchidos e convertidos em um documento XML. É necessário criar o arquivo jaxb.index com a listagem das classes que serão mapeadas para o XML.
Após o xjc ser executado, verificar se o arquivo package-info.java está conforme abaixo:
@javax.xml.bind.annotation.XmlSchema(
namespace = “http://cargadescarga.webservice.carga.siscomex.serpro.gov.br/",
elementFormDefault = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED)
package br.gov.serpro.siscomex.carga.modelws.cargadescarga;
O arquivo package-info.Java vai ser gerado tanto no pacote do web service quanto no pacote dos objetos gerados a partir do XML Schema, todos devem ser alterados.
As classes geradas serão POJOs do arquivo XML, podendo então ser programadas via getters e setters e serem passadas a seguir como parâmetro do Web Service, usando a classe CargaDescargaWSVO como principal.
Para converter o Objeto criado e preenchido em String para o envio ao Web Service deve se utilizar um Marshaller, conforme exemplo abaixo:
public static String marshalToString(Object root, String schema) {
try {
JAXBContext jc = JAXBContext.newInstance(
root.getClass().getPackage().getName());
Marshaller m = jc.createMarshaller();
m.setProperty(
Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE );
m.setProperty( Marshaller.JAXB_ENCODING, "UTF-8" );
if (schema != null) {
m.setProperty(
Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION, schema );
}
StringWriter sw = new StringWriter();
m.marshal(root, sw);
return sw.toString();
} catch( JAXBException je ) {
je.printStackTrace();
}
return null;
}