Criando um Aplicativo de Serviço da Web JAX-RPC que Usa Endereçamento de Serviço da Web
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. Essa tarefa descreve as etapas que são necessárias para criar um serviço da Web JAX-RPC que é acessado por meio de uma referência de terminal WS-Addressing. A tarefa também descreve as etapas extras que são 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
Complete essa tarefa se estiver criando um serviço da Web que usa a especificação WS-Addressing.
Procedimento
Resultados
Fornecendo uma Interface de Serviço da Web que Retorna uma Referência de Terminal para o Serviço de Destino
Os seguintes exemplos correspondem às etapas 1 à 4 no procedimento. Os exemplos mostram como uma organização de TI pode usar os serviços da Web para gerenciar uma rede de impressoras. A organização pode representar cada impressora como um recurso que é endereçado por meio de uma referência de terminal. Os seguintes exemplos mostram como codificar tal serviço usando as interfaces de programação de aplicativos (APIs) do Web Services Addressing (WS-Addressing) de propriedade da IBM que são fornecidas pelo WebSphere Application Server e JAX-WS.
A organização de TI implementa um serviço PrinterFactory que oferece um elemento CreatePrinter portType. Esse elemento portType aceita uma mensagem CreatePrinterRequest para criar um recurso que representa uma impressora lógica e responde com uma referência ao terminal que é uma referência ao recurso.
<wsdl:definitions targetNamespace="http://example.org/printer" ...
xmlns:pr=" http://example.org/printer">
<wsdl:types>
...
<xsd:schema...>
<xsd:element name="CreatePrinterRequest"/>
<xsd:element name="CreatePrinterResponse"
type="wsa:EndpointReferenceType"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="CreatePrinterRequest">
<wsdl:part name="CreatePrinterRequest"
element="pr:CreatePrinterRequest" />
</wsdl:message>
<wsdl:message name="CreatePrinterResponse">
<wsdl:part name="CreatePrinterResponse"
element="pr:CreatePrinterResponse" />
</wsdl:message>
<wsdl:portType name="CreatePrinter">
<wsdl:operation name="createPrinter">
<wsdl:input name="CreatePrinterRequest"
message="pr:CreatePrinterRequest" />
<wsdl:output name="CreatePrinterResponse"
message="pr:CreatePrinterResponse" />
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>
A operação CreatePrinter no exemplo anterior retorna um objeto wsa:EndpointReference que representa o recurso Printer criado recentemente. O cliente pode utilizar essa referência ao terminal para enviar mensagens para a instância de serviço que representa a impressora.
O método createPrinter mostrado no exemplo a seguir cria uma referência de terminal para o serviço Printer. A operação, então, obtém o identificador para a instância de recurso de impressora individual e a associa à referência ao terminal. Finalmente, o método createPrinter converte o objeto EndpointReference, que agora representa a nova impressora, em um objeto W3CEndpointReference, e retorna a referência de terminal convertida.
import com.ibm.websphere.wsaddressing.EndpointReferenceManager;
import com.ibm.websphere.wsaddressing.EndpointReference;
import com.ibm.websphere.wsaddressing.jaxws.EndpointReferenceConverter;
import com.ibm.websphere.wsaddressing.jaxws.W3CEndpointReference;
import javax.xml.namespace.QName;
public class MyClass {
// Criar a impressora
...
// Definir o ID de recursos da impressora como uma constante estática conforme é requerida em etapas posteriores
public static final QName PRINTER_ID_PARAM_QNAME = new QName("example.printersample",
"IBM_WSRF_PRINTERID", "ws-rf-pr" );
public static final QName PRINTER_SERVICE_QNAME = new QName("example.printer.com", "printer", "...");
public static final String PRINTER_ENDPOINT_NAME = new String("PrinterService");
public W3CEndpointReference createPrinter(java.lang.Object createPrinterRequest)
throws Exception {
// Criar um EndpointReference que destina o URI do WebService apropriado e o nome da porta.
EndpointReference epr = EndpointReferenceManager.createEndpointReference(PRINTER_SERVICE_QNAME,
PRINTER_ENDPOINT_NAME);
// Criar ou procurar o recurso com estado e derivar uma cadeia do
// identificador de recursos.
String resource_identifier = "...";
// Associar esse identificador de recursos ao EndpointReference como
// um parâmetro de referência.
// A opção de nome é arbitrária, mas deve ser exclusiva
// para o serviço.
epr.setReferenceParameter(PRINTER_ID_PARAM_QNAME,resource_identifier);
// A referência ao terminal, agora, destina o recurso em vez do serviço.
...
return EndpointReferenceConverter.createW3CEndpointReference(epr);
}
}
Por causa da implementação de serviços da Web descrita anteriormente, a instância de recurso da impressora tem um identificador exclusivo integrado à sua referência de terminal. Esse identificador torna-se um parâmetro de referência no cabeçalho SOAP de mensagens subsequentes destinadas no serviço da Web e pode ser usado pelo serviço da Web para corresponder a mensagens recebidas para a impressora apropriada.
Quando um serviço da Web recebe uma mensagem contendo propriedades de endereçamento de mensagens WS-Addressing, o WebSphere Application Server processa essas propriedades antes que a mensagem seja despachada para o terminal de aplicativo e as configura para o contexto de mensagem no encadeamento. O aplicativo de serviços da Web da Impressora acessa os parâmetros de referência associados ao terminal de destino do objeto WebServiceContext, conforme ilustrado no exemplo a seguir:
import com.ibm.websphere.wsaddressing.EndpointReferenceManager;
...
// Inicializar o nome do parâmetro de referência
QName name = new QName(..);
// Extrair o valor String.
String resource_identifier =
EndpointReferenceManager.getReferenceParameterFromMessageContext(PRINTER_ID_PARAM_QNAME);
A implementação de serviços da Web pode encaminhar mensagens com base na identidade da impressora adquirida do método getReferenceParameterFromMessageContext para as instâncias da impressora apropriadas.
import javax.xml.ws.BindingProvider;
...
javax.xml.ws.Service service= ...;
Printer myPrinterProxy = service.getPort(portName, Printer.class);
javax.xml.ws.BindingProvider bp = (javax.xml.ws.BindingProvider)myPrinterProxy;
// Recuperar o contexto de pedido para o objeto BindingProvider
Map myMap = myBindingProvider.getRequestContext();
// Associar a referência de terminal que representa a nova impressora ao contexto de pedido
// para que o objeto BindingProvider agora represente uma instância de impressora específica.
myMap.put(WSADDRESSING_DESTINATION_EPR, destinationEpr);
...
O objeto BindingProvider agora representa a nova instância de recurso da impressora e pode ser usado pelo
cliente para enviar mensagens à impressora através do serviço da Web da Impressora. Quando o cliente chama o objeto BindingProvider, o WebSphere Application
Server inclui propriedades de endereçamento de mensagem adequadas no cabeçalho da mensagem,
que, nesse caso, é um parâmetro de referência contido na referência de
terminal que identifica o recurso da impressora de destino.Como alternativa, o cliente pode utilizar um objeto JAX-RPC de Stub ou Call, que o cliente configura para representar a nova impressora. O uso do objeto Call é ilustrado no exemplo a seguir.
import javax.xml.rpc.Call;
...
:
// Associar a referência ao terminal que representa a nova impressora à chamada.
call.setProperty(
"com.ibm.websphere.wsaddressing.WSAConstants.
WSADDRESSING_DESTINATION_EPR ", epr);
Da perspectiva do cliente, a referência de terminal é opaca. O cliente não pode interpretar o conteúdo de nenhum parâmetro de referência ao terminal e não deve tentar utilizá-los de maneira nenhuma. Os clientes não podem criar diretamente instâncias de referências de terminal porque os parâmetros de referência são privados para o fornecedor de serviços; os clientes devem obter referências de terminal do fornecedor de serviços, por exemplo, por meio de um serviço de factory de fornecedor e, então, usá-los para direcionar operações de serviços da Web para o terminal representado pela referência de terminal, como mostrado.
O que Fazer Depois
- Consulte Segurança do Web Services Addressing para obter informações sobre segurança com o WS-Addressing.
- Implemente o aplicativo. Neste cenário, não é necessário executar nenhuma etapa adicional para ativar o suporte ao WS-Addressing no WebSphere Application Server porque você especificou uma propriedade WS-Addressing no cliente. Para obter informações adicionais, e para outros cenários que podem requerer etapas adicionais, consulte Ativando o Suporte do Web Services Addressing para Aplicativos JAX-RPC.