O Web Services Addressing (WS-Addressing) auxilia a interoperabilidade entre serviços da Web definindo uma
forma padrão de endereçar serviços da Web e fornecer informações de endereçamento em mensagens. Esta tarefa descreve as
etapas que são necessárias para criar um serviço da Web JAX-WS que é acessado usando uma referência de terminal do
WS-Addressing. A tarefa também descreve as etapas extras necessárias para usar recursos stateful como parte do serviço da Web.
Antes de Iniciar
As etapas descritas nesta tarefa se aplicam os servidores e clientes que são executados no
WebSphere Application Server.
Sobre Esta Tarefa
Conclua esta tarefa se estiver criando um serviço da Web JAX-WS que usa a especificação WS-Addressing. Esta
tarefa usa as APIs JAX-WS WS-Addressing para criar a referência de terminal necessária. Como alternativa, é possível criar
referências de terminais usando a API WS-Addressing proprietária da IBM e convertê-las em objetos da API JAX-WS para uso
com o restante do aplicativo.
Procedimento
- Forneça uma interface de serviços da Web que retorna uma referência de terminal ao serviço de destino.
A interface deve retornar uma referência de nó de extremidade, o que ela pode fazer utilizando uma operação de fábrica ou um serviço de fábrica separado. O serviço de destino pode enfrentar uma instância de recurso, por exemplo um carrinho de compras.
- Implemente o serviço da Web criado na etapa anterior.
Para a parte
WS-Addressing da implementação, conclua as seguintes etapas:
- Opcional: Inclua anotações para especificar o comportamento do
WS-Addressing. Consulte Anotações Web Services Addressing para obter detalhes adicionais.
- Opcional: Se sua interface envolver um serviço da Web que enfrente uma instância de recurso, crie ou procure a instância de
recurso.
- Opcional: Se você estiver utilizando uma instância de recurso,
obtenha o identificador do recurso. O identificador de recurso
é dependente do aplicativo e pode ser gerado durante a criação da
instância de recurso.
Atenção: Não coloque informações confidenciais no identificador de recurso,
porque ele é propagado na mensagem SOAP.
- Crie uma referência de terminal que faça referência ao serviço da Web, seguindo as instruções em
Creating endpoint references by using the JAX-WS Web Services Addressing API. Se você estiver utilizando uma instância de recurso, transmita o identificador de recurso
como parâmetro.
- Retorne a referência de nó de extremidade.
- Se o serviço da Web usar instâncias de recurso, estenda a implementação para que corresponda a mensagens recebidas
para as instâncias de recursos apropriadas. Como
você associou o identificador de recurso à referência de terminal criada
anteriormente, todas as mensagens que chegam destinadas nessa referência de terminal
contêm as informações do identificador de recurso como um parâmetro de referência no
cabeçalho SOAP da mensagem. Como o identificador de recurso é passado no cabeçalho SOAP, não é necessário expô-lo na
interface de serviço da Web.
Quando o WebSphere Application Server recebe a mensagem, ele coloca as informações no contexto
de mensagens no encadeamento. Estenda a implementação para executar as seguintes ações:
- Obtenha o identificador de instância de recurso do contexto da mensagem.
- Se você estiver utilizando o espaço de nomes 2005/08 WS-Addressing, use a propriedade
REFERENCE_PARAMETERS da classe MessageContext.
- Se você estiver utilizando o espaço de nomes 2004/08 WS-Addressing, deverá utilizar a
API WS-Addressing da IBM, especificamente o método
EndpointReferenceManager.getReferenceParameterFrom MessageContext(QName resource_id).
Utilize o seguinte método para o espaço de nomes 2005/08:...
List resourceIDList = (List)getContext().getMessageContext().get(MessageContext.REFERENCE_PARAMETERS);
...
Utilize o seguinte método para o espaço de nomes 2004/08:...
String resource_identifier =
EndpointReferenceManager.getReferenceParameterFromMessageContext(PRINTER_ID_PARAM_QNAME);
...
- Redirecionar a mensagem para a instância de recurso apropriada.
- Opcional: Configure um cliente proxy para comunicar-se com o
serviço.
- Utilize a ferramenta wsimport ou xjc para gerar os artefatos exigidos pelo
cliente.
Nota: Se quiser utilizar a especificação 2004/08 WS-Addressing,
especifique o arquivo de ligação fornecido,
app_server_root/util/SubmissionEndpointReference.xjb,
como o parâmetro -b da ferramenta. Este parâmetro informa a ferramenta para gerar objetos de referências de terminais
usando a classe SubmissionEndpointReference que é parte da implementação IBM da API JAX-WS padrão. Se você não especificar
este arquivo de ligações, os objetos de referências de terminais resultantes não funcionarão com a API JAX-WS padrão.
- No código do cliente, crie uma instância da classe de serviço.
- Obtenha um objeto de proxy da classe de serviço. Há várias formas de usar a API JAX-WS para obter objetos proxy. Por exemplo, há vários
métodos getPort na classe de serviço e um na classe EndpointReference. Para obter informações adicionais, consulte a documentação da API.
- Opcional: Utilize o recurso Addressing ou SubmissionAddressing
para ativar o suporte do WS-Addressing. Por exemplo, crie um proxy usando um método getPort que aceite os recursos de serviço da Web como um parâmetro. Se
preferir, você pode ativar o suporte do WS-Addressing usando outro método, como conjuntos de políticas. Para obter informações adicionais, consulte Ativando o Suporte de Endereçamento de Serviços da Web para Aplicativos JAX-WS.
- Utilize o objeto de proxy para chamar o método de serviço que retorna a
referência de terminal.
O código de amostra a seguir mostra um cliente que chama um serviço da Web para incluir dois números juntos. O serviço
da Web emite um chamado (o identificador de recurso) para o cliente e exige que o cliente use esse chamado ao chamar o
serviço da Web.
O cliente cria dois proxies. O primeiro proxy obtém o registro como uma
referência de terminal do serviço. O segundo proxy utiliza a classe AddressingFeature
para ativar o WS-Addressing para a especificação 2005/08 e chama o serviço para incluir
os dois números juntos.
...
CalculatorService service = new CalculatorService();
// Crie o primeiro proxy
Calculator port1 = service.getCalculatorServicePort();
// Obtenha o registro como uma referência de terminal do serviço
W3CEndpointReference epr = port1.getTicket();
// Crie o segundo proxy, utilizando um recurso de endereçamento para ativar o WS-Addressing
Calculator port2 = epr.getPort(Calculator.class, new AddressingFeature());
// Chame o serviço para incluir os números
int answer = port2.add(value0, value1);
System.out.println("A resposta é: " + answer);
...
Nota: Se os metadados da referência de terminal entrarem em conflito
com as informações já associadas à mensagem de saída, por exemplo, se o objeto proxy
estiver configurado para representar uma interface diferente, será lançada uma exceção
javax.xml.ws.WebServiceExceptio nas tentativas de chamar o terminal.
Para
definir propriedades message-addressing, como uma resposta ao terminal, utilize a SPI do
WS-Addressing de propriedade da IBM e a classe BindingProvider, conforme descrito em
Especificando e Adquirindo Message-addressing Properties Utilizando SPIs do Web Services Addressing de Propriedade da IBM.
- Opcional: Configure um cliente Dispatch para comunicar-se com o
serviço. É possível configurar um cliente de diversas maneiras; as seguintes
etapas descrevem um exemplo.
- Crie uma instância do serviço.
- Inclua uma porta no objeto de serviço.
- Crie uma instância da classe Dispatch, transmitindo a referência de
terminal.
- Crie um objeto Dispatch. Utilize o método
Service.createDispatch com os seguintes parâmetros:
Há diversas variações do método Service.createDispatch; consulte a documentação da
API para obter mais detalhes.
- Componha a mensagem de pedido do cliente.
- Chame o terminal de serviço com o cliente Dispatch.
O código a seguir mostra um fragmento de exemplo de um cliente Dispatch que
ativa o 2004/08 WS-Addressing....
CalculatorService service = new CalculatorService();
Dispatch(<SOAPMessage> dispatch = service.createDispatch(
endpointReference,
SOAPMessage.class,
Service.Mode.MESSAGE,
new SubmissionAddressingFeature(true));
...