Wsdl e spring - resolvido

Tenho que acessar este wsdl, dos correios.

O projeto é em Spring.

Qual é a melhor opção ?

Existe uma ferramenta na JDK que vc consegue gerar as classes para realizar chamadas à um determinado webservice através do wsdl. Ela se chama wsimport. Já usei e foi muito prática.

Documentação: https://docs.oracle.com/javase/7/docs/technotes/tools/share/wsimport.html

O Jar está aqui https://mvnrepository.com/artifact/com.sun.xml.ws/jaxws-tools ?

Quando vc fala, que faz automático é o request e o response ?

Ou esta https://javaee.github.io/metro-jax-ws/ ?

Falo disso: https://mkyong.com/webservices/jax-ws/jax-ws-wsimport-tool-example/

Vc usa o wsimport para gerar as classes java responsáveis por realizar as chamadas ao serviço.

C:\>wsimport -keep -verbose http://compA.com/ws/server?wsdl
parsing WSDL...

generating code...
com\mkyong\ws\ServerInfo.java
com\mkyong\ws\ServerInfoImplService.java

Depois vc chama o método no java, que será realizada a chamada da operação do wsdl.

Nesse link tem o exemplo de gerar as classes e como são usadas: http://javainsimpleway.com/understanding-jax-ws-wsimport-with-example/

Gerei as classes.

Vou tentar usar elas

Valeu

Bom ele gerou varias classes.

Não vou utilizar todas, mas a de buscar de endereço peguei as classes:

ConsultaCEP

package br.com.ghnetsoft.fretemaisbarato.webservice.consultacep;

import static javax.xml.bind.annotation.XmlAccessType.FIELD;

import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

import br.com.ghnetsoft.fretemaisbarato.webservice.endereco.EnderecoERP;
import lombok.Getter;
import lombok.Setter;

@XmlAccessorType(FIELD)
@XmlType(name = "consultaCEPResponse", propOrder = { "_return" })
@Getter
@Setter
public class ConsultaCEP {

	@XmlElement(name = "return")
	protected EnderecoERP _return;
}

ConsultaCEPResponse

package br.com.ghnetsoft.fretemaisbarato.webservice.consultacep;

import static javax.xml.bind.annotation.XmlAccessType.FIELD;

import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

import br.com.ghnetsoft.fretemaisbarato.webservice.endereco.EnderecoERP;
import lombok.Getter;
import lombok.Setter;

@XmlAccessorType(FIELD)
@XmlType(name = "consultaCEPResponse", propOrder = { "_return" })
@Getter
@Setter
public class ConsultaCEPResponse {

	@XmlElement(name = "return")
	protected EnderecoERP _return;
}

EnderecoERP

package br.com.ghnetsoft.fretemaisbarato.webservice.endereco;

import static javax.xml.bind.annotation.XmlAccessType.FIELD;

import java.util.List;

import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

import br.com.ghnetsoft.fretemaisbarato.webservice.unidadepostagem.UnidadePostagemERP;
import lombok.Getter;
import lombok.Setter;

@XmlAccessorType(FIELD)
@XmlType(name = "enderecoERP", propOrder = { "bairro", "cep", "cidade", "complemento2", "end", "uf",
		"unidadesPostagem" })
@Getter
@Setter
public class EnderecoERP {

	protected String bairro;
	protected String cep;
	protected String cidade;
	protected String complemento2;
	protected String end;
	protected String uf;
	@XmlElement(nillable = true)
	protected List<UnidadePostagemERP> unidadesPostagem;
}

UnidadePostagemERP

package br.com.ghnetsoft.fretemaisbarato.webservice.unidadepostagem;

import static javax.xml.bind.annotation.XmlAccessType.FIELD;

import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;

import br.com.ghnetsoft.fretemaisbarato.webservice.endereco.EnderecoERP;
import lombok.Getter;
import lombok.Setter;

@XmlAccessorType(FIELD)
@XmlType(name = "unidadePostagemERP", propOrder = { "diretoriaRegional", "endereco", "id", "nome", "status", "tipo" })
@Getter
@Setter
public class UnidadePostagemERP {

	protected String diretoriaRegional;
	protected EnderecoERP endereco;
	protected String id;
	protected String nome;
	protected String status;
	protected String tipo;
}

Pelo que entendi, ele não gerou com o endereço do wsdl. https://apphom.correios.com.br/SigepMasterJPA/AtendeClienteService/AtendeCliente?wsdl

Ai eu que tenho que incluir, pelo que entendi. Mas não sei aonde.

Quando usei, eu gerei as classes e coloquei num pacote separado no meu projeto. Depois soh usei as classes para realizar as chamadas. Não alterei nada nas classes geradas, nem me preocupei mais com o endereço do wsdl (soh se o endereço mudar ou se o serviço evoluir, eh claro).

Mas o que eu não entendi foi como o sistema saberá que tem que no wsdl especifico ?

Pois ainda fala que tem que ir neste endereço https://apphom.correios.com.br/SigepMasterJPA/AtendeClienteService/AtendeCliente?wsdl ?

Até onde sei, essas classes geradas possui o necessário para saber onde ir, bastando apenas chamar o método e pronto.

Vou testar e valeu

Fiz assim e não funcionou

package br.com.ghnetsoft.fretemaisbarato.rest.correio;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import br.com.ghnetsoft.fretemaisbarato.core.exception.BadRequestAlertException;
import br.com.ghnetsoft.fretemaisbarato.webservice.consultacep.ConsultaCEP;
import br.com.ghnetsoft.fretemaisbarato.webservice.endereco.EnderecoERP;
import lombok.extern.apachecommons.CommonsLog;

@CommonsLog
@RequestMapping("/api/correio")
@RestController
public class CorreioRestController {

	@GetMapping("/enderecoPeloCep/{cep}")
	public ResponseEntity<?> enderecoPeloCep(@PathVariable String cep) {
		try {
			log.info("Rest de buscar endereco pelo cep");

			ConsultaCEP consultaCep = new ConsultaCEP();
			EnderecoERP endereco = new EnderecoERP();
			endereco.setCep(cep);
			consultaCep.set_return(endereco);
			
			consultaCep.get_return();
			
			log.info("bairro " + consultaCep.get_return().getBairro());
						
			return null;
		} catch (Exception e) {
			log.error(e.getMessage(), e);
			throw new BadRequestAlertException("Erro em buscar endereco pelo cep", "correio", null);
		}
	}
}

O que está de errado ?

Gere as classes:

wsimport -keep -p correios https://apphom.correios.com.br/SigepMasterJPA/AtendeClienteService/AtendeCliente?wsdl

Depois faça assim:

import correios.AtendeCliente;
import correios.AtendeClienteService;
import correios.EnderecoERP;

public class Main {

	public static void main(String[] args) throws Exception {
		AtendeClienteService service = new AtendeClienteService();
		AtendeCliente atendeCliente = service.getAtendeClientePort();
		
		EnderecoERP enderecoERP = atendeCliente.consultaCEP("39520000");
		System.out.println(enderecoERP.getCidade());
	}
}

39520000 é o CEP da cidade onde morei. Com isso, deve imprimir “Porteirinha” no console.

Os métodos disponibilizados pelo WSDL estão na interface AtendeCliente.

1 curtida

Eu pesquisei por https://apphom.correios.com.br nos arquivo e não achei. Por isso achei estranho

Valeu demais.

O endereço do wsdl está na classe AtendeClienteService.

1 curtida

Sim, eu não estava achando. Mas agora funcionou

1 curtida