WebService JAXB

Olá,

andei pesquisando a respeito a consulta de CEP na internet, e estou com algumas duvidas com relação a estrutura do JAXB

nao sei se estou fazendo correto, peguei uns exemplos na net, porém, nao consigo fazer funcionar a minha aplicação.

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

public class BuscaCep {

	public static void main(String[] args) throws JAXBException, MalformedURLException
    {
              getEndereco("18117070");

    }

	public static Webservicecep getEndereco(String cep) throws JAXBException, MalformedURLException
    {

           JAXBContext jc = JAXBContext.newInstance(Webservicecep.class);

	       Unmarshaller u = jc.createUnmarshaller();
	       URL url = new URL( "http://cep.republicavirtual.com.br/web_cep.php?cep="+cep+"&formato=xml" );
	       Webservicecep wCep = (Webservicecep) u.unmarshal( url );
	       return wCep;
    }

}
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Webservicecep {

	private String resultado;
	private String resultado_txt;
	private String uf;
	private String cidade;
	private String bairro;
	private String tipo_logradouro;
	private String logradouro;
	public String getResultado() {
		return resultado;
	}
	public void setResultado(String resultado) {
		this.resultado = resultado;
	}
	public String getResultado_txt() {
		return resultado_txt;
	}
	public void setResultado_txt(String resultado_txt) {
		this.resultado_txt = resultado_txt;
	}
	public String getUf() {
		return uf;
	}
	public void setUf(String uf) {
		this.uf = uf;
	}
	public String getCidade() {
		return cidade;
	}
	public void setCidade(String cidade) {
		this.cidade = cidade;
	}
	public String getBairro() {
		return bairro;
	}
	public void setBairro(String bairro) {
		this.bairro = bairro;
	}
	public String getTipo_logradouro() {
		return tipo_logradouro;
	}
	public void setTipo_logradouro(String tipo_logradouro) {
		this.tipo_logradouro = tipo_logradouro;
	}
	public String getLogradouro() {
		return logradouro;
	}
	public void setLogradouro(String logradouro) {
		this.logradouro = logradouro;
	}



}

Para nisso, meu código são só essas duas classes, nao se se deveria ter mais alguma coisa, mas se estiver correto. O projeto da erro:

Exception in thread “main” javax.xml.bind.UnmarshalException

  • with linked exception:

Procurei na net, porém, nao encontrei o que eu quero.

Se alguem tiver alguma dica…

Att.

A partir do JDK 1.6 (não sei se antes suportava) tem o comando wsimport. Tem inúmeros exemplos na internet. Passa a URL do Webservice que deseja acessar e ele vai te gerar todas as classes necessárias para toda a manipulação junto ao WS.

Sorte tua… usei JAXB não faz muito tempo… :O)

public class TestMe {

    @Test
    public void test() throws JAXBException, IOException {
        Assert.assertTrue(true);
        Cep cep = getCep("04218970");
        Assert.assertNotNull(cep);
        Assert.assertEquals("Ipiranga", cep.getBairro());
    }

    private Cep getCep(String str) throws IOException, JAXBException {
        InputStream in = null;
        try {
            final URL url = new URL("http://cep.republicavirtual.com.br/web_cep.php?cep=" + str + "&formato=xml");
            in = url.openStream();

            final JAXBContext jaxbContext = JAXBContext.newInstance(Cep.class);

            final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            final Cep cep = (Cep) unmarshaller.unmarshal(in);

            return cep;

        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    //do nothing
                }
            }
        }
    }
}

@XmlRootElement(name = "webservicecep")
@XmlAccessorType(XmlAccessType.FIELD)
class Cep {

    @XmlElement
    private String resultado;

    @XmlElement(name = "resultado_txt")
    private String txt;

    @XmlElement
    private String uf;

    @XmlElement
    private String cidade;

    @XmlElement
    private String bairro;

    @XmlElement(name = "tipo_logradouro")
    private String tipoLog;

    @XmlElement
    private String logradouro;

    public String getResultado() {
        return resultado;
    }

    public void setResultado(String resultado) {
        this.resultado = resultado;
    }

    public String getTxt() {
        return txt;
    }

    public void setTxt(String txt) {
        this.txt = txt;
    }

    public String getUf() {
        return uf;
    }

    public void setUf(String uf) {
        this.uf = uf;
    }

    public String getCidade() {
        return cidade;
    }

    public void setCidade(String cidade) {
        this.cidade = cidade;
    }

    public String getBairro() {
        return bairro;
    }

    public void setBairro(String bairro) {
        this.bairro = bairro;
    }

    public String getTipoLog() {
        return tipoLog;
    }

    public void setTipoLog(String tipoLog) {
        this.tipoLog = tipoLog;
    }

    public String getLogradouro() {
        return logradouro;
    }

    public void setLogradouro(String logradouro) {
        this.logradouro = logradouro;
    }
}

hummm, vlews Pela ajuda,

percebi que tem algumas anotações a mais no exemplo listado. Vou dar uma estuda melhor no assunto.

Obrigados

Att.

Client client = Client.create(); WebResource resource = client.resource("http://cep.republicavirtual.com.br/web_cep.php?cep=18117070&formato=xml"); System.out.println(resource.get(String.class));

Tem o Jersey q acho q eh uma das maneiras mais faceis de
se consumir um web service