Galera, como eu faço para adicionar alguns namespaces em uma mensagem soap, de forma que disso:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ="http://xmlns.oracle.com/apps/sales/custExtn/extnService/types/">
<soapenv:Header/>
<soapenv:Body>
<typ:updateEntity>
<typ:object>?</typ:object>
<typ:objectName>?</typ:objectName>
</typ:updateEntity>
</soapenv:Body>
</soapenv:Envelope>
vire isso (detalhe no soapenv com vários namespaces):
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ="http://xmlns.oracle.com/apps/sales/custExtn/extnService/types/" xmlns:ns2="http://xmlns.oracle.com/apps/sales/custExtn/extnService/types/" xmlns:ns1="/oracle/apps/sales/custExtn/views/common/" xmlns:ns0="http://xmlns.oracle.com/adf/svc/types/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header/>
<soapenv:Body>
<typ:updateEntity>
<typ:object xsi:type="ns1:SalesTargetStryker_c">
<ns1:Id>300000003248774</ns1:Id>
<ns1:December_c>9999</ns1:December_c>
</typ:object>
<typ:objectName>SalesTargetStryker_c</typ:objectName>
</typ:updateEntity>
</soapenv:Body>
</soapenv:Envelope>
eu gerei o client com o netbeans, e estou tentando adicionar os namespaces sem exito
Os namespaces a mais não serão criados a menos que sejam explicitamente necessários… qual sua necessidade?
[]'s
Eles são necessários para que a chamada ao web service seja válida (coisas da oracle). De fato, eu realmente preciso deles adicionados a mensagem, e não sei como adicioná-los
@edit
Eu estou trabalhando em uma integração de um sistema próprio com o FusionCRM, e, após ter aberto uma service request, o time de suporte da oracle, me informou que esses namespaces são de fato, necessários.
Então, você pode criar um handler customizado no cliente do seu serviço para fazer este tratamento. Você pode dar uma googlada por “JAX-WS Handlers” ou checar aqui -> http://www.jroller.com/gmazza/entry/jaxws_handler_tutorial como se faz isso.
Curiosidade: não conheço o Fusion CRM… é algum nome novo para um JD Edwards da vida, ou é um produto novo?
[]'s
Tentei adicionar os namespaces da seguinte forma, mas ainda não funciona da forma esperada
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.ProtocolException;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author nathan
*/
public class MySoapHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext messageContext) {
// if (Boolean.TRUE.equals(messageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY))) {
// HandlerUtils.printMessageContext("Client SOAPHandler", messageContext);
SOAPMessage soapMessage = messageContext.getMessage();
try {
soapMessage.getSOAPPart().getEnvelope().addNamespaceDeclaration("ns0", "http://xmlns.oracle.com/adf/svc/types/");
soapMessage.getSOAPPart().getEnvelope().addNamespaceDeclaration("ns1", "/oracle/apps/sales/custExtn/views/common/");
soapMessage.getSOAPPart().getEnvelope().addNamespaceDeclaration("ns2", "http://xmlns.oracle.com/apps/sales/custExtn/extnService/types/");
soapMessage.getSOAPPart().getEnvelope().addNamespaceDeclaration("xsi", "http://www.w3.org/2001/XMLSchema-instance");
soapMessage.saveChanges();
} catch (SOAPException e) {
throw new ProtocolException(e);
}
// }
return true;
}
@Override
public boolean handleFault(SOAPMessageContext context) {
return true;
}
@Override
public void close(MessageContext context) {
}
@Override
public Set<QName> getHeaders() {
return null;
}
}
Configurei esse handler pelo próprio netbeans, mas a mensagem continua incorreta
@edit
A muito tempo atrás eu usei um software chamado tcpmon, para pegar a mensagem soap que era enviada. O que se usa nos dias atuais para ter acesso a mensagem?
Se não me engano, depois de mexer na mensagem você tem que ajustá-la de volta no contexto. Mas é só um palpite, não lembro de cabeça como isso funciona.
Quanto ao que você pode usar, eu, pelo menos, costumo usar o wireshark nessas situações. Mas só tem pra Windows e Mac =(
[]'s
Bom, vou pesquisar sobre como colocar a mensagem de volta no contexto.
Vou baixar o wireshark também
@edit
É possível usar o hireshark para debugar web services em uma conexão segura (https)?
Em conexão segura, não. Ele até intercepta os pacotes, mas tudo o que você vai conseguir ver serão dados criptografados.
[]'s
puts, o serviço que estou tentando consumir é com conexão criptografada
Tente pegar o WSDL e expôr um mock pelo SoapUI. Assim, você vai ter condições melhores para testar, inclusive.
[]'s