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: | z 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) z z z z 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.3hudson-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"> <input message="tns:TestandoOp"></input> <output message="tns:TestandoOpResponse"></output> </operation> </portType> <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"> <soap:address location="http://localhost:8080/Testando/Teste"></soap:address> </port> </service> </definitions> 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 Testando proxy; private Teste service; 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(); } } }