3

我有以下 JAX-WS 方法

public School createUpdateSchool(Perks reqeustData, DataHandler contentData)
{
----
----
}

在我的 SOAP 响应中,

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns3:CreateUpdateSchoolResponse xmlns:ns2=".........">
<return>
<ns2:Student name="Raj" ......
<ns2:Exam pattern="CBSE"............       
............    
</return>
</ns3:CreateUpdateSchoolResponse>
</S:Body>
</S:Envelope> 

事实上,我可以自定义元素,但我无法从肥皂响应中完全删除它。

  • 是否可以通过某些配置删除它?
  • 如果没有,至少通过 SOAP 处理程序如何做到这一点?

任何帮助将不胜感激。

4

1 回答 1

1

我有同样的问题,找不到另一种方法来删除服务响应的标签返回,我发现的唯一方法是实现 SOAP Handler,如下所示:

希望这有帮助,祝你好运!

import java.util.Iterator;
import java.util.Set;

import javax.xml.namespace.QName;
import javax.xml.soap.Node;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

import org.w3c.dom.NodeList;

import com.millicom.LoggerFFE;
import com.millicom.fulfillment.ws.cin.utils.ConnectorsLoggerUtil;

/**
 * @author jcperez
 * 
 */
public class SOAPLoggingHandler implements SOAPHandler<SOAPMessageContext> {

    protected static LoggerFFE logger=ConnectorsLoggerUtil.getLogger(SOAPLoggingHandler.class);

    @Override
    public boolean handleMessage(SOAPMessageContext context) {

        Boolean outboundProperty = (Boolean) context
                .get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

        //Verificamos solo los mensajes de salida
        if(outboundProperty){

            try {
                //Obtenemos el mensaje
                SOAPMessage message = context.getMessage();

                //Obtenemos los elementos del cuerpo
                @SuppressWarnings("unchecked")
                Iterator<Node> it = message.getSOAPBody().getChildElements();

                //Obtenemos el primero nodo, el que corresponde al response de la operacion
                Node node = (Node) it.next();

                //Obtenemos el nodo return
                org.w3c.dom.Node returnNode = node.getChildNodes().item(0);
                //Obtenemos los nodos hijos en una varaible temporal
                NodeList nodeList = returnNode.getChildNodes();
                //Eliminamos el nodo return
                node.removeChild(returnNode);
                //Agregamos los hijos del nodo return al nodo response de la operacion
                while(nodeList.getLength() > 0){
                   node.appendChild(nodeList.item(0));
                }

            } catch (SOAPException e) {
               logger.error("SOAPLoggingHandler#handleMessage(context) Error al obtener el body del mensaje SOAP ", e);
            } catch (Exception e) {
                logger.error("SOAPLoggingHandler#handleMessage(context) Error general ", e);
            }

        }

        return true;
    }

    @Override
    public boolean handleFault(SOAPMessageContext context) {
        //do nothing
        return true;
    }

    @Override
    public void close(MessageContext context) {
      //do nothing
    }

    @Override
    public Set<QName> getHeaders() {
        return null;
    }

}
于 2013-04-10T19:37:14.153 回答