Desabilitando o WS-Addressing no SOA Suite

Esses dias tive um problema com um projeto da Índia. O cliente, ao realizar a chamada pra um serviço que eu desenvolvi, recebia o seguinte erro:

A required header representing a Message Addressing Property is not present

Os testes realizados no SOAP-UI e cliente WS criado não apresentavam nenhum erro, então ficava difícil simular o ocorrido. Pela mensagem informada, podemos ter dois tipos de erro:

  • O cliente está adicionando um header na requisição inválido
  • Ou o servidor está esperando um header que o cliente não enviou


Fui investigar os headers gerados pelo SOA Suite e por padrão ele adiciona o header de WS-Addressing:

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing">
	<env:Header>
		<wsa:MessageID>urn:8C092A70319311E1BF0C3FD5A35C8139</wsa:MessageID>
		<wsa:ReplyTo>
			<wsa:Address>http://www.w3.org/2005/08/addressing/anonymous</wsa:Address>
		</wsa:ReplyTo>
	</env:Header>
	<env:Body>
		<autorizaResponse xmlns="http://www.thiagovespa.com.br/transacao">
			<Token>1232d333038383938353637323530363538321</Token>
		</autorizaResponse>
	</env:Body>
</env:Envelope>

Da linha 3 a 6 podemos observar que o SOA Suite adicionou o header do WS-Addressing na resposta. Para desabilitar é necessário incluir dois parâmetros no binding dos serviços. No JDeveloper isso pode ser feito abrindo o composite.xml, selecionando o serviço na lateral esquerda (Exposed Services)  e no Property Inspector (Ctrl+Shift+I), adicionar duas novas propriedades do binding (Binding Properties):

  • oracle.soa.ws.outbound.omitWSA - valor: true
  • oracle.soa.addressing.response.enabled - valor: false

A propriedade oracle.soa.ws.outbound.omitWSA como true irá remover a necessidade do header na requisição e a propriedade oracle.soa.addressing.response.enabled como false irá remover a geração do header na resposta. O código fonte do composite.xml deverá ficar com o binding mais ou menos igual à esse:

<binding.ws port="http://www.thiagovespa.com.br/transacao#wsdl.endpoint(testebpelprocess_client_ep/transacaoSoap_pt)">
	<property name="oracle.soa.ws.outbound.omitWSA" type="xs:string" many="false" override="may">true</property>
	<property name="oracle.soa.addressing.response.enabled" type="xs:string" many="false" override="may">false</property>
</binding.ws>

Agora é só executar e você terá uma resposta sem o header do WS-Addressing:

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
	<env:Header/>
	<env:Body>
		<autorizaResponse xmlns="http://www.thiagovespa.com.br/transacao">
			<Token>12335353638353935333535383732333032321</Token>
		</autorizaResponse>
	</env:Body>
</env:Envelope>

O cliente que não tinha suporte ao WS-Addressing irá funcionar sem mais problemas.

Sobre: Thiago Galbiatti Vespa

Thiago Galbiatti Vespa é mestre em Ciências da Computação e Matemática Computacional pela USP e bacharel em Ciências da Computação pela UNESP. Coordenador de projetos do JavaNoroeste, membro do JCP (Java Community Process), consultor Oracle, arquiteto de software de empresas de médio e grande porte, palestrante de vários eventos e colaborador de projetos open source. Possui as certificações: Oracle Certified Master, Java EE 5 Enterprise Architect – Step 1, 2 and 3; Oracle WebCenter Portal 11g Certified Implementation Specialist; Oracle Service Oriented Architecture Infrastructure Implementation Certified Expert; Oracle Certified Professional, Java EE 5 Web Services Developer; Oracle Certified Expert, NetBeans Integrated Development Environment 6.1 Programmer; Oracle Certified Professional, Java Programmer; Oracle Certified Associate, Java SE 5/SE 6