在JAX-WS SOAP响应中删除元素<return>

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响应中完全删除。
  • 是否可以通过某些配置来删除它?
  • 如果不行,至少可以通过SOAP处理程序来实现吗?
非常感谢您的帮助。

可能是从JAX-WS的SoapResponse中删除<return>元素的重复问题。 - Marjan Venema
这个有什么进展吗? - Zeus
1个回答

1

我有同样的问题,找不到另一种方法来删除服务响应的标签返回,我找到的唯一方法是实现以下SOAP处理程序:

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

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;
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接