Java 根据要求添加CDATA';仅使用JAX-WS的s字符串参数

Java 根据要求添加CDATA';仅使用JAX-WS的s字符串参数,java,web-services,jax-ws,cdata,Java,Web Services,Jax Ws,Cdata,我有一个用CXF连接的jax ws客户端 请求有一个字符串参数(MGRequest),该参数包含一个xml,除生成的请求外,所有工作如下: <S:Body> <ns5:MGRequest>&lt;mytag&gt;hello&lt;/mytag&gt;</ns5:MGRequest> </S:Body> Service client = new Service(url); client.setHandlerR

我有一个用CXF连接的jax ws客户端

请求有一个字符串参数(MGRequest),该参数包含一个xml,除生成的请求外,所有工作如下:

<S:Body>
   <ns5:MGRequest>&lt;mytag&gt;hello&lt;/mytag&gt;</ns5:MGRequest>
</S:Body>
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);
client.setHandlerResolver(HandlerFactory.build(new LoggerHandler(), new CDataHandler()));
我这样称呼:

<S:Body>
   <ns5:MGRequest>&lt;mytag&gt;hello&lt;/mytag&gt;</ns5:MGRequest>
</S:Body>
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);
client.setHandlerResolver(HandlerFactory.build(new LoggerHandler(), new CDataHandler()));
我尝试在
@webgram
之前添加
@XmlJavaTypeAdapter(cdatadapter.class)
,但结果是:

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

![CDATA[mytaghello/mytag]]
其中CDATA适配器:

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;
    }
}
公共类CDATA适配器扩展了XmlAdapter{
@凌驾
公共字符串封送处理程序(字符串v)引发异常{
返回“”;
}
@凌驾
公共字符串解组(字符串v)引发异常{
返回v;
}
}
知道如何存档吗?
谢谢

经过一个晚上的工作,我找到了解决办法: 向客户端添加
javax.xml.ws.handler.handler
,如下所示:

<S:Body>
   <ns5:MGRequest>&lt;mytag&gt;hello&lt;/mytag&gt;</ns5:MGRequest>
</S:Body>
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);
client.setHandlerResolver(HandlerFactory.build(new LoggerHandler(), new CDataHandler()));
我的HandlerFactory在其中构建处理程序:

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;
      }
    };
  }
公共静态HandlerResolver生成(最终处理程序…处理程序){
返回新的HandlerResolver(){
@凌驾
公共列表getHandlerChain(PortInfo PortInfo){
List handlerChain=new ArrayList();
if(处理程序!=null){
for(处理程序:处理程序){
handlerChain.add(handler);
}
}
返回手柄链;
}
};
}

import javax.xml.namespace.QName;
导入javax.xml.soap.Node;
导入javax.xml.soap.SOAPMessage;
导入javax.xml.ws.handler.MessageContext;
导入javax.xml.ws.handler.soap.SOAPHandler;
导入javax.xml.ws.handler.soap.SOAPMessageContext;
公共类CDATA处理程序实现SOAPHandler{
@凌驾
公共无效关闭(MessageContext上下文){
}
@凌驾
公共布尔handleMessage(SOAPMessageContext soapMessage){
试一试{
SOAPMessage=SOAPMessage.getMessage();
布尔isOutboundMessage=(布尔)soapMessage
.get(MessageContext.MESSAGE\u出站\u属性);
//这是一个请求吗?
如果(isOutboundMessage){
//使用根标记中的文本构建CDATA节点
节点cddata=(节点)message.getSOAPPart().createCDATA节(
message.getSOAPBody().getFirstChild().getTextContent());
//在soap消息中添加CDATA的节点
message.getSOAPBody().getFirstChild().appendChild(cddata);
//删除包含将转义的原始文本的文本标记
message.getSOAPBody().getFirstChild()
.removeChild(message.getSOAPBody().getFirstChild().getFirstChild());
}
}捕获(例外情况除外){
//失败
}
返回true;
}
@凌驾
公共布尔handleFault(SOAPMessageContext soapMessage){
返回true;
}
@凌驾
公共集getHeaders(){
返回集合。空集合;
}
}

这是一个简单的类,我只有一个带有文本的标记,但在更复杂的场景中,您可以在DOM中执行必要的操作。

要使用上述解决方案,您需要在handleMessage函数中添加“message.saveChanges();”。看见