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.