2016-08-25 6 views
1

を使用して要求の文字列パラメータにCDATAを私はCXFはJAX-WS

要求にganerated JAX-WSクライアントがXMLを含む文字列パラメータ(MGRequest)を持っている、すべての作業者が、生成された要求がされて追加します

<S:Body> 
    <ns5:MGRequest><![CDATA[<mytag>hello</mytag>]]></ns5:MGRequest> 
</S:Body> 

(私は、サーバーを制御することはできませんので...)

:私のような体を生成する必要が

<S:Body> 
    <ns5:MGRequest>&lt;mytag&gt;hello&lt;/mytag&gt;</ns5:MGRequest> 
</S:Body> 

:このような

クライアントは、標準のJAX-WSのようなものです:

@WebService(name = "ServiceSoap") 
@XmlSeeAlso({ ObjectFactory.class}) 
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) 
public interface ServiceSoap { 

    @WebMethod(operationName = "ProcessMessage") 
    @WebResult(name = "MGResponse") 
    public String processMessage(
     @WebParam(partName = "input", name = "MGRequest") String input); 
} 

、私は次のように呼び出す:

Service client = new Service(url); 
client.setHandlerResolver(HandlerFactory.build(new LoggerHandler())); 

ServiceSoap service = client.getServiceSoap(); 

String msgToSend = JaxbUtil.jaxbObjToString(xmlObj, false); 
String response = service.processMessage(msgToSend); 

私は@WebParam@XmlJavaTypeAdapter(CDataAdapter.class)を追加しようとしたが、結果はでした:

<S:Body> 
    <ns5:MGRequest>&lt;![CDATA[&lt;mytag&gt;hello&lt;/mytag&gt;]]&gt;</ns5:MGRequest> 
</S:Body> 

ここでCDataAdapter:

public class CDataAdapter extends XmlAdapter<String, String> { 

    @Override 
    public String marshal(String v) throws Exception { 
     return "<![CDATA[" + v + "]]>"; 
    } 

    @Override 
    public String unmarshal(String v) throws Exception { 
     return v; 
    } 
} 

これをアーカイブする方法はありますか? おかげ

作業の夜の後

答えて

2

は、私は解決策を見つけた: は次のようにクライアントにjavax.xml.ws.handler.Handlerを追加:

public static HandlerResolver build(final Handler... handlers) { 

    return new HandlerResolver() { 
     @Override 
     public List<Handler> getHandlerChain(PortInfo portInfo) { 
     List<Handler> handlerChain = new ArrayList<Handler>(); 

     if (handlers != null) { 
      for (Handler handler : handlers) { 
      handlerChain.add(handler); 
      } 
     } 
     return handlerChain; 
     } 
    }; 
    } 

:私のHandlerFactoryはハンドラを構築

client.setHandlerResolver(HandlerFactory.build(new LoggerHandler(), new CDataHandler())); 

import javax.xml.namespace.QName; 
import javax.xml.soap.Node; 
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; 

public class CDataHandler implements SOAPHandler<SOAPMessageContext> { 

    @Override 
    public void close(MessageContext context) { 
    } 

    @Override 
    public boolean handleMessage(SOAPMessageContext soapMessage) { 
    try { 
     SOAPMessage message = soapMessage.getMessage(); 
     boolean isOutboundMessage = (Boolean) soapMessage 
      .get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 

     // is a request? 
     if (isOutboundMessage) { 
     // build a CDATA NODE with the text in the root tag 
     Node cddata = (Node) message.getSOAPPart().createCDATASection(
      message.getSOAPBody().getFirstChild().getTextContent()); 

     // add the CDATA's node at soap message 
     message.getSOAPBody().getFirstChild().appendChild(cddata); 

     // remove the text tag with the raw text that will be escaped 
     message.getSOAPBody().getFirstChild() 
      .removeChild(message.getSOAPBody().getFirstChild().getFirstChild()); 

     } 

    } catch (Exception ex) { 
     // fail 
    } 
    return true; 
    } 

    @Override 
    public boolean handleFault(SOAPMessageContext soapMessage) { 
    return true; 
    } 

    @Override 
    public Set<QName> getHeaders() { 
    return Collections.EMPTY_SET; 
    } 
} 

これはシンプルなクラスです。より複雑なシナリオでは、DOMをナビゲートするために必要なアクションを取ることができます。

+1

上記の解決策を適用するには、「message.saveChanges();」を追加する必要があります。 in handleMessageメッセージ関数。 https://www.mkyong.com/webservices/jax-ws/jax-ws-soap-handler-in-client-side/を参照してください。 –

関連する問題