Adicionar namespace a soapenv:Envelop (web service jax-ws)

10 respostas
nathanpsouza

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 :confused:

10 Respostas

Alexandre_Saudate

Os namespaces a mais não serão criados a menos que sejam explicitamente necessários… qual sua necessidade?

[]'s

nathanpsouza

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 :confused:

@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.

Alexandre_Saudate

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

nathanpsouza

Obrigado cara, vou ler esses docs.

O Fusion é um outro produto, http://www.oracle.com/us/products/applications/fusion/fusion-crm-170775.html

nathanpsouza

Tentei adicionar os namespaces da seguinte forma, mas ainda não funciona da forma esperada :confused:

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 :confused:

@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?

Alexandre_Saudate

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

nathanpsouza

Bom, vou pesquisar sobre como colocar a mensagem de volta no contexto.

Vou baixar o wireshark também :smiley:

@edit

É possível usar o hireshark para debugar web services em uma conexão segura (https)?

Alexandre_Saudate

Em conexão segura, não. Ele até intercepta os pacotes, mas tudo o que você vai conseguir ver serão dados criptografados.

[]'s

nathanpsouza

puts, o serviço que estou tentando consumir é com conexão criptografada :confused:

Alexandre_Saudate

Tente pegar o WSDL e expôr um mock pelo SoapUI. Assim, você vai ter condições melhores para testar, inclusive.

[]'s

Criado 17 de abril de 2013
Ultima resposta 17 de abr. de 2013
Respostas 10
Participantes 2