Java Web服务客户端cdata标签
问题描述:
是否有可能以简单的方式在cdata标签内发送字符串以避开转义字符? 我对此String使用@XmlCDATA标记,并将其值更改为当我使用Marshaller时。但是当我想发送请求到SoapUI时,不会添加这个。当我手动添加此标签(例如在setter中)时,它会转义字符。Java Web服务客户端cdata标签
例如: 如果我使用编组我得到:
<?xml version="1.0" encoding="UTF-8"?>
<getRequest xmlns="pl/nosd/Get">
<ClientNumber>
<![CDATA[<CLIENT_NUMBER>]]>
</ClientNumber>
</getRequest>
这就是正确的。
但是,当我想给这个使用服务SOAPUI:
sync_Customer_Service = new Sync_Customer_Service();
Customer_PortType customer_PortType = sync_Customer_Service.getCustomer_HTTPSPort();
GetRequest getRequest = new GetRequest();
getRequest.setClientNumber("<CLIENT_NUMBER>");
customer_PortType.get(getRequest);
我得到:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:GetRequestMessage xmlns="pl/nosd/Get" xmlns:ns2="http://pl/nosd/Get/xsd">
<ClientNumber><CLIENT_NUMBER></ClientNumber>
</ns2:GetRequestMessage>
</S:Body>
</S:Envelope>
我加jaxb.properties与文件:javax.xml.bind.context.factory的= org.eclipse.persistence.jaxb.JAXBContextFactory
和我加入@XMLCdata批注的GetRequest类:
public class GetRequest {
@XmlCDATA
@XmlElement(name = "ClientNumber", required = true)
protected String clientNumber;
public String getClientNumber() {
return clientNumber;
}
public void setClientNumber(String value) {
this.clientNumber = value;
}
服务和portType类是由jdeveloper通过使用Web服务代理选项生成的。
答
我找到了解决方案。解决方法不是美观,但它的工作原理。在客户端I类添加处理程序:
BindingProvider bp = (BindingProvider)account_PortType;
List<Handler> handlerList = bp.getBinding().getHandlerChain();
RequestResponseHandler reqResHelper = null;
handlerList.add(new HeaderHandler());
bp.getBinding().setHandlerChain(handlerList);
而且在处理我与C数据值替换值:
public class HeaderHandler implements SOAPHandler<SOAPMessageContext> {
private static final String SYSTEM_ID = "pl/Customer.wsdl";
private static final String NODE_NAME = "ClientNumber";
public boolean handleMessage(SOAPMessageContext context) {
try{
Boolean outboundProperty = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (outboundProperty.booleanValue()) {
Object o = context.get(LogicalMessageContext.WSDL_DESCRIPTION);
org.xml.sax.InputSource is = (org.xml.sax.InputSource)o;
if(is.getSystemId().contains(SYSTEM_ID)){
SOAPMessage message = context.getMessage();
SOAPBody body = message.getSOAPBody();
Node e =getNode(body.getChildNodes());
CDATASection cdataSection = message.getSOAPPart().createCDATASection(e.getFirstChild().getNodeValue());
e.replaceChild(cdataSection, e.getFirstChild());
}
}
}catch(Exception e){
//TODO logować
}
return true;
}
public Node getNode(NodeList a){
if(a!=null&&a.getLength()>0){
for(int i = 0;i<a.getLength();i++){
Node b = a.item(i);
if(b.getNodeName()!=null && b.getNodeName().contains(NODE_NAME)){
return b;
}
Node node = getNode(b.getChildNodes());
if(node!=null){
return node;
}
}
}
return null;
}
在soapUI的,我们看到:
<ns6:ClientNumber>
<![CDATA[data]]>
</ns6:ClientNumber>
什么是有CDATA,而不是一个点逃脱的字符串?这些是相同数据的两种表示。 – vanje
系统,我发送请求预计该表单。 – krzysiek