JAX-WS
A Java™ API for XML-Based Web Services (JAX-WS) é o modelo de programação de próxima geração dos serviços da Web complementando a base fornecida pelo modelo de programação da Java API for XML-based RPC (JAX-RPC). Usando o JAX-WS, o desenvolvimento de serviços e clientes da Web é simplificado com mais independência de plataforma para aplicativos Java pelo uso de proxies dinâmicos e anotações Java.
O JAX-WS é um modelo de programação que simplifica o desenvolvimento de aplicativos por meio do suporte de um modelo padrão baseado em anotação para desenvolver aplicativos e clientes de serviços da Web. A tecnologia do JAX-WS alinha estrategicamente a si próprio com a tendência do segmento de mercado atual voltado para um modelo de mensagem central de documento e substitui o modelo de programação de chamada de procedimento remoto, conforme definido pelo JAX-RPC. Embora o modelo de programação de JAX-RPC e os aplicativos ainda sejam suportados por este produto, o JAX-RPC tem limitações e não suporta vários serviços complexos centrados em documento. O JAX-WS é o modelo de programação estratégico para desenvolvimento de serviços da Web e é uma parte necessária do Java Platform, Enterprise Edition 6 (Java EE 6). O JAX-WS também é conhecido como JSR 224.
A especificação JAX-WS 2.2 substitui e inclui as funções na especificação JAX-WS 2.1. O JAX-WS 2.2 inclui suporte do lado do cliente para uso de anotações relacionadas ao WebServiceFeature, como anotações @MTOM, @Addressing e @RespectBinding. O JAX-WS 2.1 tinha suporte incluído anteriormente para essas anotações no servidor. Agora também é possível ativar e configurar o suporte do WS-Addressing em um cliente ou serviço ao incluir asserções do WS-Policy no documento WSDL. Além disso, os Serviços da Web para a especificação Java EE 1.3 apresenta suporte para essas anotações relacionadas ao WebServiceFeature, bem como suporte para uso de elementos descritores de implementação para configurar esses recursos no cliente e no servidor. O JAX-WS 2.2 exige o Java Architecture for XML Binding (JAXB) Versão 2.2 para ligação de dados.
A implementação do padrão de programação JAX-WS fornece os seguintes aprimoramentos para desenvolvimento de serviços da Web e clientes:
- Independência de plataforma aprimorada para aplicativos Java.
Usando JAX-WS APIs, o desenvolvimento de serviços da Web e clientes é simplificado com mais independência de plataforma para aplicativos Java. O JAX-WS obtém vantagem do mecanismo de proxy dinâmico para fornecer um modelo de delegação formal com um provedor plugável. Esse é um aprimoramento em relação ao JAX-RPC, que depende da geração de stubs específicos do fornecedor para chamada.
- Anotações
O JAX-WS fornece suporte para anotação de classes Java com metadados para indicar que a classe Java é um serviço da Web. O JAX-WS suporta o uso de anotações com base no Recurso de Metadados para a especificação Java Programming Language (JSR 175), os Metadados de Serviços da Web para a especificação Java Platform (JSR 181) e anotações definidas pela especificação JAX-WS 2.2. O uso de anotações na origem Java e na classe Java simplifica o desenvolvimento de serviços da Web. Use anotações para definir informações especificadas normalmente em arquivos do descritor de implementação, arquivos WSDL ou no mapeamento de metadados de arquivos XML e WSDL para os artefatos de origem.
Por exemplo, é possível incorporar uma tag @WebService simples na origem Java para expor o bean como um serviço da Web.
A anotação @WebService solicita ao ambiente de tempo de execução do servidor para expor todos os métodos públicos nesse bean como um serviço da Web. Os níveis adicionais de granularidade podem ser controlados incluindo-se anotações adicionais sobre os métodos ou parâmetros individuais. O uso de anotações facilita muito mais a exposição de artefatos Java como serviços da Web. Além disso, como os artefatos são criados a partir do uso de algumas ferramentas de mapeamento descendente que se iniciam a partir de um arquivo WSDL, as anotações são incluídas dentro da origem e classes Java como uma maneira de capturar metadados juntamente com os arquivos de origem.@WebService public class QuoteBean implements StockQuote { public float getQuote(String sym) { ... } }
O uso de anotações aprimora também o desenvolvimento de serviços da Web em uma estrutura de equipe, pois não precisa definir cada serviço da Web em um descritor de implementação comum ou único, como requerido com os serviços da Web do JAX-RPC. Tirar vantagem de anotações com serviços da Web JAX-WS permite o desenvolvimento paralelo do serviço e os metadados necessários.
Para serviços da web JAX-WS, o uso do descritor de implementação webservices.xml é opcional porque é possível usar anotações para especificar todas as informações que estão contidas dentro do arquivo do descritor de implementação. É possível utilizar o arquivo do descritor de implementação para aumentar ou substituir anotações JAX-WS existentes. Qualquer informação definida no descritor de implementação webservices.xml substitui quaisquer informações correspondentes especificadas pelas anotações.
Por exemplo, se sua classe de implementação de serviço do seu serviço da Web JAX-WS incluir o seguinte:- a anotação @WebService:
@WebService(wsdlLocation=”http://myhost.com/location/of/the/wsdl/ExampleService.wsdl”)
- o arquivo webservices.xml especifica um nome de arquivo
diferente para o documento WSDL como a seguir:
<webservices> <webservice-description> <webservice-description-name>ExampleService</webservice-description-name> <wsdl-file>META-INF/wsdl/ExampleService.wsdl</wsdl-file> ... </webservice-description> </webservices>
- a anotação @WebService:
- Chamando Serviços da Web de Forma Assíncrona
Com o JAX-WS, os serviços da Web são chamados de maneira síncrona e assíncrona. O JAX-WS inclui suporte para um mecanismo de pesquisa e de retorno de chamada ao chamar serviços da Web de forma assíncrona. Usando um modelo de sondagem, um cliente pode emitir um pedido, obter de volta um objeto de resposta, que é sondado para determinar se o servidor respondeu. Quando o servidor responde, a resposta real é recuperada. Usando o modelo de retorno de chamada, o cliente fornece um manipulador de retorno de chamada para aceitar e processar o objeto de resposta de entrada. Os modelos de sondagem e de retorno de chamada permitem que o cliente se concentre em continuar a processar o trabalho sem aguardar que uma resposta seja retornada, enquanto fornece um modelo mais dinâmico e eficiente para chamar os serviços da Web.
Por exemplo, uma interface de serviço da Web pode ter métodos para solicitações síncronas e assíncronas. Os pedidos assíncronos são identificados em negrito no seguinte exemplo:@WebService public interface CreditRatingService { // operação síncrona Score getCreditScore(Customer customer); // operação assíncrona com sondagem Response<Score> getCreditScoreAsync(Customer customer); // operação assíncrona com retorno de chamada Future<?> getCreditScoreAsync(Customer customer, AsyncHandler<Score> handler); }
A chamada assíncrona que usa o mecanismo de retorno de chamada requer uma entrada adicional pelo programador do cliente. O retorno de chamada é um objeto que contém o código do aplicativo que será executado quando uma resposta assíncrona for recebida. Utilize o exemplo de código a seguir para chamar um manipulador de retorno de chamada assíncrono:CreditRatingService svc = ...; Future<?> invocation = svc.getCreditScoreAsync(customerFred, new AsyncHandler<Score>() { public void handleResponse ( Response<Score> response) { Score score = response.get(); // trabalho aqui... } } );
Utilize o exemplo de código a seguir para chamar um cliente de sondagem assíncrono:CreditRatingService svc = ...; Response<Score> response = svc.getCreditScoreAsync(customerFred); while (!response.isDone()) { // Conclua uma ação enquanto esperamos. } // Não é necessário difundir, por causa dos genéricos. Score score = response.get();
- Usando a injeção do recurso
O JAX-WS suporta injeção de recursos para simplificar ainda mais o desenvolvimento de serviços da Web. O JAX-WS usa esse recurso-chave do Java EE 5 para deslocar a carga de criação e inicialização de recursos comuns em um ambiente de tempo de execução Java do seu aplicativo de serviço da Web para o próprio ambiente de contêiner do aplicativo. O JAX-WS fornece suporte para um subconjunto de anotações definidas em JSR-250 para injeção de recurso e ciclo de vida do aplicativo em seu ambiente tempo de execução.
O servidor de aplicativos também suporta o uso da anotação @Resource ou @WebServiceRef para declarar clientes gerenciados pelo JAX-WS e para solicitar injeção de serviços e portas do JAX-WS. Quando qualquer uma dessas anotações é utilizada em um campo ou um método, ela resulta na injeção de uma instância de serviço ou de porta do JAX-WS. O uso dessas anotações também resulta no tipo especificado pela anotação que está sendo ligada ao espaço de nomes do JNDI.
A anotação do @Resource é definida pela especificação JSR-250, Common Annotations incluída no Java Platform, Enterprise Edition 5 (Java EE 5). Ao colocar a anotação @Resource em uma variável do tipo javax.xml.ws.WebServiceContext em uma classe de implementação de terminal em serviço, você pode solicitar a injeção de um recurso e coletar a interface javax.xml.ws.WebServiceContext relacionada a essa chamada de terminal específica. Da interface WebServiceContext, é possível coletar MessageContext para o pedido associado à chamada de método em particular, usando o métodogetMessageContext().
A anotação @WebServiceRef é definida pela especificação JAX-WS.
O exemplo a seguir ilustra o uso das anotações @Resource e @WebServiceRef para a injeção de recurso:@WebService public class MyService { @Resource private WebServiceContext ctx; @Resource private SampleService svc; @WebServiceRef private SamplePort port; public String echo (String input) { … } }
Consulte as seções 5.2.1 e 5.3 da especificação JAX-WS para obter informações adicionais sobre a injeção de recurso.
- Ligação de Dados com JAXB 2.2
O JAX-WS potencializa a API Java Architecture for XML Binding (JAXB) 2.2 e as ferramentas como a tecnologia de ligação para mapeamentos entre os objetos Java e os documentos XML. As ferramentas JAX-WS dependem das ferramentas JAXB para a ligação de dados padrão para mapeamentos bidirecionais entre os objetos Java e os documentos XML. A ligação de dados do JAXB substitui a ligação de dados descrita pela especificação do JAX-RPC.
O JAX-WS 2.2 requer JAXB 2.2 para a ligação de dados. O JAXB 2.2 fornece aprimoramentos menores em suas anotações para a geração de esquema aprimorado e melhor integração com o JAX-WS.
- Clientes Dinâmicos e Estáticos
A API de cliente dinâmico para JAX-WS é chamada de cliente dispatch (javax.xml.ws.Dispatch). O cliente dispatch é um cliente orientado ao sistema de mensagens XML. Os dados são enviados no modo PAYLOAD ou MESSAGE. Ao usar o modo PAYLOAD, o cliente dispatch só é responsável por fornecer o conteúdo do <soap:Body> e o JAX-WS inclui os elementos <soap:Envelope> e <soap:Header>. Ao utilizar o modo MESSAGE, o cliente dispatch é responsável pelo fornecimento de todo o envelope SOAP, incluindo os elementos <soap:Envelope>, <soap:Header> e <soap:Body>. O JAX-WS não inclui nada adicional na mensagem. O cliente dispatch suporta chamadas assíncronas usando um mecanismo de retorno de chamada ou de sondagem.
O modelo de programação de cliente estático para JAX-WS é chamado de cliente de proxy. O cliente proxy chama um serviço da Web com base em uma Service Endpoint interface (SEI), que deve ser fornecida.
- Suporte para MTOM
Usando o JAX-WS, é possível enviar anexos binários, como imagens ou arquivos, junto com solicitações de serviços da Web. O JAX-WS inclui suporte para transmissão otimizada de dados binários conforme especificado pelo MTOM (Message Transmission Optimization Mechanism).
- Várias tecnologias de ligação de dados
O JAX-WS expõe as seguintes tecnologias de ligação ao usuário final: XML Source, SOAP Attachments API for Java (SAAJ) 1.3 e Java Architecture for XML Binding (JAXB) 2.2. A XML Source possibilita a um usuário transmitir um javax.xml.transform.Source para o ambiente de tempo de execução que representa os dados em um objeto de Origem a ser processado. A SAAJ 1.3 agora tem a capacidade de transmitir um documento SOAP inteiro pela interface, e não apenas a carga útil. Essa ação é feita pelo cliente transmitindo-se o objeto SAAJ SOAPMessage por meio da interface. O JAX-WS potencializa o suporte JAXB 2.2 como a tecnologia de ligação de dados de escolha entre Java e XML.
- Suporte para SOAP 1.2
O suporte para SOAP 1.2 foi incluído ao JAX-WS 2.0. O JAX-WS suporta SOAP 1.1 e SOAP 1.2 para que você possa enviar anexos binários, como imagens ou arquivos, junto com solicitações de serviços da Web. O JAX-WS inclui suporte para transmissão otimizada de dados binários conforme especificado pelo MTOM.
- Ferramentas de desenvolvimento
O JAX-WS fornece as ferramentas de linhas de comandos wsgen e wsimport para geração de artefatos móveis para serviços da Web JAX-WS. Ao criar serviços da Web JAX-WS, é possível iniciar com um arquivo WSDL ou uma classe de bean de implementação. Se você iniciar com uma classe de bean de implementação, use a ferramenta de linha de comandos wsgen para gerar todos os artefatos do servidor de serviços da Web, incluindo um arquivo WSDL, se necessário. Se você iniciar com um arquivo WSDL, use a ferramenta de linha de comandos wsimport para gerar todos os artefatos de serviços da Web para o servidor ou o cliente. A ferramenta de linha de comandos wsimport processa o arquivo WSDL com definições de esquema para gerar os artefatos móveis, que incluem a classe de serviço, a classe de interface de terminal em serviço e as classes JAXB 2.2 para o esquema XML correspondente.
- Suporte para Serviços da Web para Java EE, versão 1.3
A especificação Web Services for Java EE versão 1.3 inclui suporte para a configuração dos recursos MTOM, Addressing e RespectBinding em serviços e clientes JAX-WS por meio do uso de anotações e de entradas do descritor de implementação.
- Suporte para targetNamespace vazio para o estilo de parâmetro
WRAPPED e tipos de retornoO JAX-WS 2.2 suporta parâmetros de método e tipos de retorno. Em uma operação de serviços da Web JAX-WS, é possível definir uma operação de serviços da Web com um parâmetro de operação e um tipo de retorno opcional. Se o parâmetro de operação e o tipo de retorno definirem uma propriedade targetNamespace vazia especificando um valor "" para a propriedade targetNamespace com a anotação @WebParam ou @WebResult, o ambiente de tempo de execução JAX-WS se comportará da seguinte maneira:
- Se a operação for do estilo de documento, o estilo do parâmetro for WRAPPED e o parâmetro não for mapeado para um cabeçalho, um namespace vazio será mapeado com os parâmetros de operação e tipos de retorno.
- Se o estilo do parâmetro não for WRAPPED, o valor do parâmetro targetNamespace especificado usando a anotação @WebParam ou @WebResult será usado.