Sou relativamente novo no mundo dos webservices e minha pesquisa parece ter me confundido mais do que me esclarecido. Meu problema é que recebi uma biblioteca (jar) que preciso estender com algumas funcionalidades do webservice.
Esta biblioteca será compartilhada com outros desenvolvedores, e entre as classes no jar estarão as classes que têm um método que chama um serviço da web (que essencialmente define um atributo da classe, faz alguma lógica de negócios, como armazenar o objeto em um banco de dados, etc e envia de volta o objeto com essas modificações). Quero tornar a chamada para este serviço o mais simples possível, com sorte o mais simples possível, de forma que o desenvolvedor que usa a classe só precise fazer.
Car c = new Car("Blue");
c.webmethod();
Tenho estudado JAX-WS para usar no servidor, mas me parece que não preciso criar um wsimport
no servidor nem wsimport
no cliente, pois sei que ambos possuem as classes, só preciso de alguma interação entre as classes compartilhado no servidor e no cliente. Como você acha que faz sentido fazer o serviço da Web e a chamada na aula?
Respostas:
Eu entendo que seu problema se resume a como chamar um serviço da web SOAP (JAX-WS) de Java e obter seu objeto de retorno . Nesse caso, você tem duas abordagens possíveis:
wsimport
delas e as use; ouSobre a primeira abordagem (usando
wsimport
):Vejo que você já tem as classes de negócios de serviços (entidades ou outras), e é um fato que o
wsimport
gera um novo conjunto de classes (que são de alguma forma duplicatas das classes que você já tem).Infelizmente, neste cenário, você só pode:
wsimport
código gerado para que ele use suas classes de negócios (isso é difícil e de alguma forma não vale a pena - tenha em mente que toda vez que o WSDL mudar, você terá que regenerar e readaptar o código); ouwsimport
classes geradas. (Nesta solução, seu código de negócios poderia "usar" as classes geradas como um serviço de outra camada de arquitetura.)Sobre a segunda abordagem (crie seu cliente SOAP personalizado):
Para implementar a segunda abordagem, você terá que:
java.net.HttpUrlconnection
(e algumjava.io
manuseio).Criar um cliente SOAP usando o clássico
java.net.HttpUrlConnection
não é tão difícil (mas também não é tão simples), e você pode encontrar neste link um código inicial muito bom.Eu recomendo que você use a estrutura SAAJ:
Veja abaixo um exemplo funcional (execute-o!) De uma chamada de serviço da web SOAP usando SAAJ. Ele chama esse serviço da web .
Sobre o uso de JAXB para serializar / desserializar, é muito fácil encontrar informações sobre ele. Você pode começar aqui: http://www.mkyong.com/java/jaxb-hello-world-example/ .
fonte
<xsd:element name="Incident_Number" type="xsd:string"/>
. Como você pode ver, o elemento é fechado e nenhuma informação é gerada a partir do WS.GetInfoByCity
é503Service Unavailable
, parece. :(Ou apenas use wsdl2java do Apache CXF para gerar objetos que você pode usar.
Ele está incluído no pacote binário que você pode baixar no site deles. Você pode simplesmente executar um comando como este:
Ele usa o WSDL para gerar objetos, que você pode usar como este (nomes de objetos também são agarrados a partir do WSDL, então o seu vai ser um pouco diferente):
Existe até um plug-in Maven que gera as fontes: https://cxf.apache.org/docs/maven-cxf-codegen-plugin-wsdl-to-java.html
Nota: Se você gerar fontes usando CXF e IDEA, você pode querer dar uma olhada em: https://stackoverflow.com/a/46812593/840315
fonte
Encontrei uma forma alternativa muito mais simples de gerar mensagem de sabão. Dado um Objeto Pessoa:
Abaixo está um gerador de mensagem de sabão simples:
Você pode usar por:
fonte