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: 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:
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.gotchaCWWKW0037E: The WSDL that is compliant with the JAX-WS 2.2 specification cannot be generated.
- 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).

- 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.
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.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
- 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
- Identifique os métodos que deseja expor como operações de serviços da Web.
- Revise as regras para exposição de métodos como operações em classes anotadas com a anotação @WebService.
- 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.

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: 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.
O que Fazer Depois
Desenvolva os artefatos Java para aplicativos JAX-WS a partir de JavaBeans.