Tenho que acessar este wsdl, dos correios.
O projeto é em Spring.
Qual é a melhor opção ?
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
Quando vc fala, que faz automático é o request e o response ?
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
.
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
.
Sim, eu não estava achando. Mas agora funcionou