Web Services utilizando JAX-WS
JAX-WS Facilitar o uso da API JAX-RPC e do modelo de implantação Anotações baseados em JSR-181 Exemplo Básico: Anotações: @WebService @WebMethod @WebParam @WebResult
Exemplo com Anotações @WebService(name = "TravelAgent", servicename="travelagentservice") @Stateless public class TravelAgentBean implements TravelAgentRemote { @PersistenceContext(unitName="titan") private EntityManager manager; @WebMethod public void createcabin(@webparam(name = "Cabin") Cabin cabin ) { manager.persist(cabin); @WebMethod @WebResult(name = "Cabin ) public Cabin findcabin(@webparam(name = "ID ) int pkey ) { return manager.find(cabin.class, pkey);
A anotação WebService Deve ser colocada na classe de implementação de bean de sessão sem informação de estado (ou POJO) @WebService(name,wsdlLocation,endpointInterface, portname) name: nome do serviço Web quando mapeado para WSDL. Assume como padrão o nome da classe Java ou interface. wsdllocation: define a url do documento wsdl. endpointinterface: externaliza o contrato do serviço Web na forma de uma interface Web. portname: porta WSDL utilizada.
A anotação WebMethod Métodos anotados com @WebMethod estarão disponíveis para o serviço Web. Se a classe for anotada com @WebService e nenhum método com @WebMethod, todos os métodos estarão disponíveis no Web Service. Boa prática de projeto para reduzir dependências entre módulos. Atributo operationname é utilizado para definir a operação WSDL que o método anotado implementa. Se não especificado, o nome do método é utilizado.
A anotação WebParam Permite controlar o WSDL gerado para um método Java sinalizado com @WebMethod Se o estilo for RPC/LITERAL(wsdl:part), o atributo name() configurará o nome wsdl:part Exemplo (produz um wsdl): @WebMethod(OperationName = CheckStatus ) public int checkstatus( @WebParam(name = ReservationID ) String reservationid @WebParam(name = CustomerID, mode = WebParam.Mode.OUT) javax.ws.holder<integer> customerid){ customerid.value = getcustomerid(reservationid); Return status;
A anotação WebResult Fornece a mesma funcionalidade pra valores de retorno que @WebParam oferece para parâmetros de métodos
Exemplo de WS Serviço package teste; public class Testando { int cont; public Testando(){ cont = 0; public int TestandoOp(String param1) { return (param1.length()); public int TestandoOp1() { return (++cont);
Exemplo de WS Cliente package client; public class TesteCliente { private Testando proxy; public static void main(string[] args) { TesteCliente client = new TesteCliente(); client.dotest(args); public void dotest(string[] args) { proxy = new Testando(); int ret = proxy.testandoop1(); System.out.println("Resultado testandoop1: "+ret); ret = proxy.testandoop("1234567890"); System.out.println("Resultado testandoop: "+ret); ret = proxy.testandoop1(); System.out.println("Resultado testandoop1: "+ret);
Exemplo de WS Serviço* package teste; import javax.jws.webservice; import javax.jws.webmethod; import javax.jws.webparam; @WebService( name = "Testando", servicename = "Teste") public class Testando { int cont; public Testando(){ cont = 0; @WebMethod( operationname = "TestandoOp") public int TestandoOp( @WebParam( name = "param1") String param1) { return (param1.length()); @WebMethod( operationname = "TestandoOp1") public int TestandoOp1() { return (++cont);
Exemplo de WS - WSDL <?xml version="1.0" encoding="utf-8"?><!-- Published by JAX-WS RI at http://jaxws.dev.java.net. RI's version is JAX-WS RI 2.1.3.3-hudson-757-SNAPSHOT. --><!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.3.3- hudson-757-snapshot. --><definitions xmlns:wsu="http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://teste/" xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetnamespace="http://teste/" name="teste"> <types> <xsd:schema> <xsd:import namespace="http://teste/" schemalocation="http://localhost:8080/testando/teste?xsd=1"></xsd:import> </xsd:schema> </types> <message name="testandoop"> <part name="parameters" element="tns:testandoop"></part> </message> <message name="testandoopresponse"> <part name="parameters" element="tns:testandoopresponse"></part> </message>
Exemplo de WS - WSDL <porttype name="testando"> <operation name="testandoop"> </operation> </porttype> <input message="tns:testandoop"></input> <output message="tns:testandoopresponse"></output> <binding name="testandoportbinding" type="tns:testando"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"></soap:binding> <operation name="testandoop"> <soap:operation soapaction=""></soap:operation> <input> <soap:body use="literal"></soap:body> </input> <output> <soap:body use="literal"></soap:body> </output> </operation> </binding> <service name="teste"> <port name="testandoport" binding="tns:testandoportbinding"> </port> </service> </definitions> <soap:address location="http://localhost:8080/testando/teste"></soap:address>
Exemplo de WS - XSD <?xml version="1.0" encoding="utf-8"?><!-- Published by JAX-WS RI at http://jaxws.dev.java.net. RI's version is JAX-WS RI 2.1.3.3-hudson-757-SNAPSHOT. --><xs:schema xmlns:tns="http://teste/" xmlns:xs="http://www.w3.org/2001/xmlschema" version="1.0" targetnamespace="http://teste/"> <xs:element name="testandoop" type="tns:testandoop"></xs:element> <xs:element name="testandoopresponse" type="tns:testandoopresponse"></xs:element> <xs:complextype name="testandoop"> <xs:sequence> <xs:element name="param1" type="xs:string" minoccurs="0"></xs:element> </xs:sequence> </xs:complextype> <xs:complextype name="testandoopresponse"> <xs:sequence> <xs:element name="return" type="xs:int"></xs:element> </xs:sequence> </xs:complextype> </xs:schema>
Exemplo de WS Cliente* package client; import usingteste.testando; import usingteste.teste; public class TesteCliente { private Teste service; private Testando proxy; public static void main(string[] args) { TesteCliente client = new TesteCliente(); client.dotest(args); public void dotest(string[] args) { try { service = new Teste(); proxy = service.gettestandoport(); int ret = proxy.testandoop1(); System.out.println("Resultado testandoop1: "+ret); ret = proxy.testandoop("1234567890"); System.out.println("Resultado testandoop: "+ret); ret = proxy.testandoop1(); System.out.println("Resultado testandoop1: "+ret); catch(exception e) { e.printstacktrace();