Implementando Clientes de Serviços da Web JAX-WS Estáticos
Você desenvolveu clientes de serviços da Web estáticos baseados nos Serviços da Web para a especificação Java™ Platform, Enterprise Edition (Java EE) e no modelo de programaçãoJava API for XML-Based Web Services (JAX-WS).
Antes de Iniciar

Sobre Esta Tarefa
- Desenvolvendo clientes de serviços da Web baseados no modelo de programação JAX-WS
Clientes de serviços da Web que podem acessar e chamar serviços da Web JAX-WS são desenvolvidos baseados nos Serviços da Web para a especificaçãoJava Platform, Enterprise Edition (Java EE). O servidor de aplicativos suporta clientes EJB (Enterprise JavaBeans), aplicativos clientes Java EE, arquivos JSP (JavaServer Pages) e servlets que são baseados no modelo de programação JAX-WS. Clientes de serviços da Web baseados na especificação JAX-RPC podem chamar serviços da Web baseados em JAX-WS se o arquivo Web Services Description Language (WSDL) estiver em conformidade com o Perfil Básico Web Services-Interoperability (WS-I).
O modelo de programação do cliente JAX-WS suporta a API do cliente Dispatch e a API do cliente de proxy dinâmico. A API do cliente Dispatch é um modelo de programação de cliente dinâmico, enquanto que o modelo de programação de cliente estático para JAX-WS é o cliente de proxy dinâmico. Os clientes Dispatch e de proxy dinâmico possibilitam chamadas síncronas e assíncronas de serviços da Web JAX-WS.
O cliente de proxy dinâmico chama um serviço da Web baseado em uma service endpoint interface (SEI) que é fornecida. As instâncias de proxy dinâmico do JAX-WS otimizam a função de proxy dinâmico no Java SE Runtime Environment (JRE) 6 base. Deve-se iniciar com um arquivo WSDL se você estiver desenvolvendo um cliente estático.
Em contraste, a API do cliente Dispatch, javax.xml.ws.Dispatch, é um cliente orientado a serviço de mensagens XML destinado a desenvolvedores de XML avançados que preferem utilizar construções XML. A API Dispatch pode enviar os dados no modo PAYLOAD ou MESSAGE. Ao usar o modo CARGA ÚTIL, o cliente Dispatch só é responsável por fornecer os conteúdos de soap:Body e JAX-WS inclui a carga útil em um elemento soap:Envelope. Ao utilizar o modo MESSAGE, o cliente Dispatch é responsável por fornecer o envelope SOAP inteiro. Você não precisa de um arquivo WSDL se estiver desenvolvendo um cliente dinâmico.
Para desenvolver clientes de serviços da Web baseados no modelo de programação JAX-WS, você deve determinar o modelo do cliente que melhor se ajusta às necessidades do seu aplicativo de serviço da Web. Se desejar que o cliente de serviços da Web chame o serviço baseado em interfaces de terminal em serviço com um proxy dinâmico, use a API de Proxy Dinâmico para desenvolver um cliente de serviço da Web estático. Depois que os proxies forem criados, o aplicativo cliente pode chamar métodos nesses proxies como uma implementação padrão das interfaces de terminal de serviço. Porém, se desejar trabalhar diretamente com XML em vez de uma abstração Java e trabalhar com a estrutura da mensagem ou a estrutura da carga útil da mensagem, use a API Dispatch para desenvolver um cliente de serviço da Web dinâmico. Consulte sobre a implementação de serviços da Web JAX-WS dinâmicos para aprender como desenvolver clientes de serviços da Web dinâmicos.
Conclua essa tarefa para desenvolver um cliente de serviços da Web iniciando com um arquivo WSDL.
Para chamar serviços da Web assincronicamente usando um cliente JAX-WS estático ou dinâmico, determine se deseja implementar o retorno de chamada ou o modelo de pesquisa. Consulte sobre como chamar serviços da Web JAX-WS assincronicamente para obter informações adicionais quanto à implementação assíncrona do retorno de chamada ou pesquisa para clientes de serviço da Web. O modelo de programação JAX-WS para o serviço e o cliente usa anotações para representar as mesmas informações que foram fornecidas na ligação do cliente JAX-RPC de maneira neutra pelo fornecedor.
- Clientes de serviços da Web JAX-WS gerenciados e não gerenciados
O servidor de aplicativos suporta ambos os clientes de serviços da Web, gerenciados e não gerenciados, quando usa o modelo de programação JAX-WS:
- Clientes Gerenciados
Os clientes Web services for Java EE são definidos pelo JSR (Java Specification Requirements) 109 e são clientes gerenciados por serem executados em um contêiner de Java EE. Esses clientes são empacotados como arquivos EAR (enterprise archive) e contêm componentes que agem como solicitantes de serviços. Esses componentes são compostos de um aplicativo clienteJava EE, um componente da Web como um servlet ou JavaServer Pages (JSP), ou um Enterprise JavaBeans (EJB) de sessão. Clientes gerenciados de serviços da Web usam APIs JSR 109 e informações de implementação para consultar e chamar um serviço da Web.
Para os clientes gerenciados, você pode utilizar a consulta JNDI (Java Naming and Directory Interface) para executar a consulta de serviço ou pode utilizar anotações para injetar instâncias de um serviço ou porta JAX-WS. Consulte sobre a configuração da Segurança de Serviços da Web do token UserName, Segurança de Serviços da Web de assinatura digital e Segurança de Serviços da Web do token Lightweight Third-Party Authentication (LTPA). O código a seguir é um exemplo de uma consulta de contexto compatível com JSR 109:
InitialContext ctx = new InitialContext(); FredsBankService service =(FredsBankService)ctx.lookup("java:comp/env/service/FredsBankService"); FredsBank fredsBank = service.getFredsBankPort(); long balance = fredsBank.getBalance();
Você pode utilizar a anotação @WebServiceRef ou @Resource para declarar clientes gerenciados. O uso dessas anotações resulta no tipo especificado pela anotação que está sendo ligada ao espaço de nomes do JNDI. Quando as anotações são utilizadas em um campo ou um método, elas também resultam na injeção de uma instância de serviço ou de porta do JAX-WS. Você pode utilizar essas anotações em vez de declarar entradas service-ref no descritor de implementação cliente. O descritor de implementação cliente ainda pode ser utilizado para declarar clientes gerenciados pelo JAX-WS, semelhante a clientes gerenciados pelo JAX-RPC. Também é possível utilizar o descritor de implementação para substituir e aumentar as informações especificadas pelas anotações @WebServiceRef e @Resource. Utilize a anotação @WebServiceRef para ligar e injetar uma instância de serviço ou de porta do JAX-WS. A anotação @Resource só pode ser utilizada para ligar e injetar uma instância de serviço do JAX-WS. O uso de qualquer uma dessas anotações para declarar clientes gerenciados pelo JAX-WS só é suportado em determinados tipos de classes. Alguns desses tipos de classes incluem classes de implementação de terminal JAX-WS, classes do manipulador JAX-WS, classes de enterprise bean e classes de servlet.
O exemplo a seguir utiliza a anotação @WebServiceRef para obter uma instância de FredsBank:
Agora, dentro da classe, o campo fredsBank não precisa ser inicializado. É possível utilizar esse campo diretamente:@WebServiceRef(name=”service/FredsBankPort”, value=FredsBankService.class) FredsBank fredsBank;
long balance = fredsBank.getBalance();
Também é possível utilizar a anotação @WebServiceRef para obter instâncias de classes de serviço JAX-WS, por exemplo:@WebServiceRef(name=”service/FredsBankService”) FredsBankService service;
Agora, dentro da classe, o campo service não precisa ser inicializado. É possível utilizar esse campo diretamente:FredsBank fredsBank = service.getFredsBankPort(); long balance = fredsBank.getBalance();
Além da anotação @WebServiceRef, você pode utilizar a anotação @Resource para obter uma instância de classes de serviço JAX-WS, por exemplo:@Resource(name=”service/FredsBankService”, type=FredsBankService.class) FredsBankService service;
Assim como com a anotação @WebServiceRef, agora você pode utilizar o campo service sem instanciação, por exemplo:FredsBank fredsBank = service.getFredsBankPort(); long balance = fredsBank.getBalance();
As anotações @Resource ou @WebServiceRef podem ser utilizadas em uma classe. Nesse caso, o JNDI deve ser utilizado para consultar o serviço ou a porta JAX-WS, por exemplo:@WebServiceRef(name=”service/FredsBankService”, type=FredsBankService”) public class J2EEClientExample { … … public static void main(String[] args) { … … InitialContext ctx = new InitialContext(); FredsBankService service =(FredsBankService)ctx.lookup("java:comp/env/service/FredsBankService"); FredsBank fredsBank = service.getFredsBankPort(); long balance = fredsBank.getBalance(); } … }
Para obter informações adicionais sobre como utilizar as anotações @WebServiceRef e @Resource, consulte as especificações para JSR-109, JSR-224, JSR-250 e Java EE 5 (Java Platform Enterprise Edition 5).
Conforme mencionado anteriormente, ao usar anotações ou JNDI para obter instâncias de serviços e portas JAX-WS, não instancie os objetos retornados. Fazer isso resultará em uma instância de cliente não gerenciado. A seguir está um exemplo de uso incorreto:@WebServiceRef(name=”service/FredsBankService”) FredsBankService service; service = new FredsBankService(); // o cliente torna-se não gerenciado.
Para clientes gerenciados pelo JAX-WS que sejam declarados pela anotação @WebServiceRef ou @Resource, e para clientes que sejam declarados utilizando entradas service-ref no descritor de implementação cliente, você pode utilizar o console administrativo para fornecer a URL de terminal utilizada pelo cliente. Essa URL especificada substitui a URL de terminal no documento WSDL utilizado pelo cliente. Para saber mais sobre como especificar essa URL de terminal, consulte a documentação Configurando ligações de cliente de serviços da Web.
- Clientes Não Gerenciados
Clientes da Java Platform, Standard Edition (Java SE 6) que usam o ambiente de tempo de execução JAX-WS para chamar serviços da Web e não executam em nenhum contêinerJava EE são conhecidos como clientes não gerenciados. Um cliente não gerenciado de serviços da Web é um cliente Java independente que pode inspecionar diretamente um arquivo WSDL e formular as chamadas para o serviço da Web usando as APIs JAX-WS. Esses clientes são compactados como arquivos JAR, que não contêm informações de implementação.
- Clientes Gerenciados
A partir do WebSphere Application Server Versão 7.0 e posterior, nos módulos do aplicativo Java EE 5 (módulos de aplicativo da web versão 2.5 ou superior, ou módulos EJB versão 3.0 ou superior) ocorre a varredura de anotações para identificação de serviços e clientes JAX-WS. Entretanto, os módulos aplicativos pré-Java EE 5 (módulos aplicativos da web versão 2.4 ou anterior, ou módulos EJB versão 2.1 ou anterior) não são digitalizados para anotações JAX-WS, por padrão, para considerações de desempenho. No Feature Pack for Web Services Versão 6.1, o comportamento padrão é digitalizar módulos aplicativos da web pré-Java EE 5 para identificar serviços JAX-WS e digitalizar módulos aplicativos da web pré-Java EE 5 e módulos EJB para clientes de serviço durante a instalação do aplicativo. Como o comportamento padrão para o WebSphere Application Server Versão 7.0 e mais recente é não varrer módulos pré-Java EE 5 para anotações durante a instalação do aplicativo ou inicialização do servidor, para preservar a compatibilidade com versões anteriores com o feature pack de liberações anteriores, deve-se configurar a propriedade UseWSFEP61ScanPolicy no META-INF/MANIFEST.MF de um arquivo web application archive (WAR) ou módulo EJB ou definir a propriedade customizada de Java virtual machine, com.ibm.websphere.webservices.UseWSFEP61ScanPolicy, em servidores para solicitar varredura durante a instalação do aplicativo e inicialização do servidor. Para aprender mais sobre a varredura de anotações, consulte as informações de anotações do JAX-WS.
Procedimento
Resultados
Você criou e testou um aplicativo de cliente de serviço da Web.
O que Fazer Depois
Após desenvolver um cliente de aplicativo de serviços da Web, e o cliente estar estaticamente limitado, o terminal em serviço usado pela implementação é aquele identificado no arquivo WSDL que você usou durante o processo de desenvolvimento. Durante ou após a instalação do aplicativo de serviços da Web, você pode querer mudar o terminal em serviço. Para clientes gerenciados, você pode alterar o terminal com o console administrativo ou a ferramenta de script wsadmin. Para clientes de serviços da Web JAX-WS, é possível mudar o terminal de dentro do aplicativo cliente.
Também é possível considerar a customização dos seus serviços da Web implementando extensões para o seu cliente de serviços da Web. Alguns exemplos dessas extensões incluem o envio e o recebimento de valores em cabeçalhos SOAP ou o envio e o recebimento de cabeçalhos de transporte HTTP ou JMS (Java Message Service). Para aprender mais sobre essas extensões, leia sobre a implementação de extensões para clientes de serviços da Web.