Erro ao utilizar o cliente Soap no WebLogic

Para quem tentou utilizar o projeto de cliente Soap descrito nesse post no WebLogic, pode ter tido algum problema semelhante à esse:

java.lang.UnsupportedOperationException: This class does not support SAAJ 1.1
 at weblogic.webservice.core.soap.SOAPMessageImpl.getSOAPBody(SOAPMessageImpl.java:631)
 at org.gvlabs.utils.soap.SoapClient.invokeOperation(SoapClient.java:76)

Isso é porque é a implementação do SAAJ padrão do WebLogic é falha, conforme descrito nesse outro post. Como work-around segundo o artigo, seria só passar o seguinte parâmetro na inicialização do server do WebLogic:

-Djavax.xml.soap.MessageFactory=com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl

Ou setar no setDomainEnv.sh do seu servidor:

JAVA_OPTIONS="-Djavax.xml.soap.MessageFactory=com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl"
export JAVA_OPTIONS

O problema é que para mim, o problema não foi resolvido. Então resolvi alterar a implementação do SoapClient para instanciar fixo no código. Alterando essas linhas:

			// Connection
			SOAPConnectionFactory soaConnFactory = SOAPConnectionFactory
				.newInstance();
			connection = soaConnFactory.createConnection();

			// Message
			MessageFactory messageFactory = MessageFactory.newInstance();
			SOAPMessage message = messageFactory.createMessage();

Para isso:

			// Connection
			SOAPConnectionFactory soaConnFactory = new com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnectionFactory();
			connection = soaConnFactory.createConnection();

			// Message
			MessageFactory messageFactory = new com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl();
			SOAPMessage message = messageFactory.createMessage();

Dessa forma eu garanto que vai instanciar a implementação desejada. Infelizmente ocorreu outro erro:

Caused By: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Bad response: (400Bad Request
 at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:258)
 at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:144)

Ao verificar que a mensagem estava vindo no padrão incorreto (SOAP 1.1 e não SOAP 1.2), resolvi voltar o código anterior e alterei para o seguinte:

			// Connection
			SOAPConnectionFactory soaConnFactory = SOAPConnectionFactory
				.newInstance();
			connection = soaConnFactory.createConnection();

			// Message
			MessageFactory messageFactory = MessageFactory
				.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
			SOAPMessage message = messageFactory.createMessage();

Dessa maneira os problemas foram resolvidos. Você pode mudar também para o protocolo correto, caso necessário: SOAPConstants.SOAP_1_1_PROTOCOL. A nova versão do soap-utils com três clients SoapClient (default), Soap11Client (SOAP 1.1) e Soap12Client (SOAP 1.2) estão disponíveis para download no Google Code e no GitHub.

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