Expondo Métodos em Serviços da Web JAX-WS Baseados em SEI

É possível usar as anotações @WebService e @WebMethod em uma implementação de terminal em serviço para especificar métodos Java™ que você deseja expor como serviços da Web Java API for XML-Based Web Services (JAX-WS).

Antes de Iniciar

A tecnologia JAX-WS possibilita a implementação de serviços da Web baseados em ambas as interfaces, de terminal de serviço padrão e de um Provedor Ao desenvolver um serviço da Web JAX-WS que inicia a partir de classes Javaexistentes, conhecido como abordagem ascendente, você deve anotar a classe com a anotação @WebService ou @WebServiceProvider para definir inicialmente a classe como um serviço da Web.

O uso da interface do provedor é a abordagem dinâmica para definir seus serviços JAX-WS. Para utilizar a interface do provedor, sua classe deve implementar a interface javax.xml.ws.Provider e conter a anotação @WebServiceProvider. A interface do provedor tem um método, o invoke, que utiliza genéricos na linguagem de programação Java para controlar os tipos de entrada e de saída ao trabalhar com várias mensagens ou cargas úteis de mensagem.

Em contraste, é possível usar anotações Java para descrever seus serviços da web usando a abordagem da interface de terminal em serviço (SEI).

Sobre Esta Tarefa

Para definir inicialmente um serviço da Web, anote a classe Java com a anotação @WebService. Também é possível anotar seletivamente métodos individuais com a anotação @WebMethod para controlar sua exposição como operações de serviços da Web.

Devido às ambiguidades nas diversas especificações de serviços da Web quanto a como os métodos são expostos como operações, use as seguintes diretrizes para ajudar a garantir o comportamento consistente independentemente da implementação JAX-WS que você usar.

  • Para definir um serviço da Web básico, anote a classe de implementação com a anotação @WebService.
  • Para definir os seus serviços da Web usando um SEI explícito, faça uma referência explicitamente a uma classe da interface Java usando o atributo endpointInterface da anotação @WebService.
  • Forneça uma referência a um arquivo WSDL no atributo wsdlLocation da anotação @WebService. Ao especificar um arquivo WSDL predefinido, o desempenho será melhorado. Também, discrepâncias entre o arquivo WSDL e as anotações são relatadas para você pelo ambiente de tempo de execução.
    Evitar Problemas Evitar Problemas: De acordo com a especificação JAX-WS 2.2, se SOAP 1.2 for declarado como o tipo de ligação e o atributo wsdlLocation for uma sequência vazia, que é o padrão, o contêiner não poderá gerar o WSDL automaticamente. Portanto, se você usar ?wsdl para solicitar o arquivo WSDL, a mensagem de exceção a seguir será exibida:
    CWWKW0037E: The WSDL that is compliant with the JAX-WS 2.2 specification cannot be generated.
    Se desejar exibir o arquivo WSDL, deve-se gerar manualmente o arquivo WSDL, colocá-lo no aplicativo e especificar o atributo wsdlLocation com o local correto.gotcha
  • AO usar uma SEI explícita, todos os métodos públicos na SEI e as classes herdadas são sempre expostos. Você só precisará incluir anotações @WebMethod se quiser customizar ainda mais os métodos já expostos.
  • Fornecer uma referência na anotação @WebService para um SEI explícito ou para um arquivo WSDL existente ajuda a remover possíveis ambiguidades quando os métodos são expostos.
  • Se você não usar um SEI explícito, siga essas regras para garantir que os seus métodos são expostos consistentemente:
    • Inclua uma anotação @WebService em sua classe de implementação e todas as suas superclasses que contêm os métodos que você deseja expor. Incluir uma anotação @WebService em uma classe expõe todos os métodos públicos nessa classe que não são estáticos ou finais.
    • Se desejar mais controle granular para expor apenas certos métodos, use a anotação @WebMethod em métodos selecionados. Para assegurar-se de que um método seja exposto, anote-o com a anotação @WebMethod. Se desejar certificar-se de que um método não será exposto, anote-o com a anotação @WebMethod(exclude=true).
Configurações suportadas Configurações suportadas: sptcfg
Mudança de comportamento para expor métodos que não são anotados:

O comportamento de JAX-WS mudou quanto à exposição de métodos como operações de serviços da Web. Isso está em conformidade com recentes esclarecimentos para as especificações JAX-WS.

Os aplicativos sem um SEI ou WSDL explícito que são migrados de versões anteriores podem ter operações adicionais expostas, conforme mostrado a seguir. É possível configurar uma propriedade para que o ambiente de tempo de execução JAX-WS use o comportamento legado. Você pode precisar disso ao migrar aplicativos sem um WSDL ou um SEI para que métodos adicionais não sejam expostos.

@WebService
public class Foo {
	@WebMethod
	public void a() {}	// exposto agora, exposto antes
	public void b() {}	// exposto agora, não exposto antes
}
Usando a nova interpretação, os métodos públicos em uma classe de implementação e suas superclasses são expostas apenas sob as seguintes condições:
  • A classe contêiner tem uma anotação @WebService.
  • O método não possui uma anotação @WebMethod(exclude=true).
Usando a interpretação de legado, um método em uma classe de implementação e suas superclasses apenas são expostas sob as seguintes condições:
  • A classe contêiner tem uma anotação @WebService.
  • O método não possui nenhuma anotação @WebMethod E nenhum outro método possui anotações @WebMethod.
  • O método possui uma anotação @WebMethod ou @WebMethod(exclude=false).

Para especificar que o ambiente de tempo de execução JAX-WS usa o comportamento @WebMethod legado, configure a propriedade jaxws.runtime.legacyWebMethod=true. É possível configurar essa propriedade como uma propriedade de sistema Java Virtual Machine (JVM) ou como uma propriedade no arquivo META-INF/MANIFEST.MF de um arquivo web application archive (WAR). Por padrão, essa propriedade é configurada como false, e o servidor de aplicativos usa o novo comportamento.

Você pode encontrar uma mensagem de erro WSWS7054E se todas as seguintes condições forem verdadeiras:
  • Seu aplicativo de serviço da Web consiste de métodos não anotados.
  • Os métodos não precisam ser mapeados para uma operação de serviço da Web.
  • Se aplicativo não referencia um SEI nem compacta um arquivo WSDL.
A mensagem de erro contém informações que são semelhantes ao seguinte texto:
javax.xml.ws.WebServiceException: WSWS7054E:
 The Web Services Description Language (WSDL) file could not be generated for the XXXX Web service implementation
 class because of the following error: javax.xml.ws.WebServiceException: Unable to create JAXBContext
O conjunto de ferramentas JAX-WS está em conformidade com a especificação JAX-WS com relação aos princípios de mapeamento @WebMethod. Essa mudança pode afetar os aplicativos que dependeram de um comportamento padrão anterior não compatível. Se seus aplicativos compactarem e referenciarem o WSDL ou um SEI e tiverem TODOS os métodos anotados corretamente com o sinalizador de exclusão @WebMethod na implementação SEI, essa mudança não afetará nada. Entretanto, se afetar algo, inclua anotações explícitas nos seus métodos para assegurar que elas sejam excluídas na geração WSDL. Por exemplo: @WebMethod(exclude=true) Além disso, é possível compactar um WSDL com seu aplicativo para eliminar a necessidade de o tempo de execução em gerar um WSDL a seu favor.
Mudança de comportamento para expor métodos estatísticos e finais:

Métodos estatísticos ou finais em um serviço sem um SEI explícito não são mais expostos como operações de serviços da Web. Para expô-los, compacte o WSDL com o aplicativo e configure jaxws.runtime.legacyWebMethod=true.

Procedimento

  1. Identifique os métodos que deseja expor como operações de serviços da Web.
  2. Revise as regras para exposição de métodos como operações em classes anotadas com a anotação @WebService.
  3. Use as boas práticas para aplicar as anotações @WebMethod e @WebService em aplicativos sem SEIs para expor apropriadamente os métodos como operações dentro dos seus serviços da Web.

Resultados

Você usou a anotação @WebMethod para especificar quais métodos expor como operações de serviços da Web.

Evitar Problemas Evitar Problemas:

Se você atualizou o ambiente do seu servidor de aplicativos e está enfrentando problemas, revise as seguintes informações de resolução de problemas.

Erros de cliente indicam uma incompatibilidade entre o arquivo WSDL e a portType ao usar um ambiente do conjunto de ferramentas JAX-WS versão 2.1.6 ou mais recente
É possível receber uma mensagem de erro do lado do cliente como a seguinte:
javax.xml.ws.WebServiceException: A validação do Terminal falhou devido aos seguintes erros:
:: Interface de Terminal Inválida ::
:: O número de operações na portType WSDL não corresponde ao número de métodos no SEI ou serviço da Web
 implementação de serviço da Web.  operações wsdl = [...] operações de dispatch = [....]

Para corrigir esse problema, você deve gerar novamente os artefatos do cliente para que correspondam ao arquivo WSDL.

Boas Práticas Boas Práticas: Certifique-se de gerar novamente os artefatos do lado do cliente sempre que receber um arquivo WSDL atualizado. bprac
Os clientes que executam uma operação ?WSDL nos serviços da Web possuem operações não despacháveis
Depois de executar uma operação ?WSDL, você pode receber um arquivo WSDL contendo mais operações do que o ambiente de tempo de execução JAX-WS pode fazer dispatch. Se o cliente tentar chamar alguma das operações não passíveis de dispatch, ele receberá um erro como a seguinte mensagem:
The endpoint reference (EPR) for the Operation not found is http://localhost:9086/example/BeanImpl2Service and the WSA 
Action = <WSA_action_from_server>. Se, anteriormente, essa EPR podia ser atingida, entre em contato com o administrador do servidor.
Os clientes devem acessar apenas as operações que o serviço da Web pretende expor. Esse problema pode ser corrigido de uma das seguintes maneiras:
  • Modifique as anotações @WebMethod no aplicativo de serviços da Web para que o arquivo WSDL resultante exponha o conjunto de operações correto.
  • Configure a propriedade jaxws.runtime.legacyWebMethod para false para garantir que todas as operações no WSDL são despachados.
gotcha

Ícone que indica o tipo de tópico Tópico de Tarefa



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_devjaxws_exposewebmethod
Nome do arquivo: twbs_devjaxws_exposewebmethod.html