【webservice】cxf开发常见问题汇总

212 阅读1分钟

@[toc]

1. 使用soapui测试时存在cdata嵌套的问题

说明:如果使用soapui进行webservice测试时要求数据放置在<![CDATA[]]>中间,但是如果传递的XML文件中也存在cdata,并且不做处理的话,会报错:com.ctc.wstx.exc.WstxParsingException: Unexpected close tag </ROWKEY>; expected </message>. at [row,col {unknown-source}]: [11,99] ,这是由于XML中cdata不允许嵌套导致的。错误示例如下: 对于如下

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="ws.dis.clinical.viewigh.com">
   <soapenv:Header/>
   <soapenv:Body>
      <ws:req1>
         <!--Optional:-->
         <message>
<![CDATA[
         <Root>
<ROWKEY><![CDATA[0026|1242010044162664X7|000303786200|2|2336747&3|1242010044162664X7.EMR]]></ROWKEY>
]]>
       </Root>
         </message>
      </ws:operationRequest>
   </soapenv:Body>
</soapenv:Envelope>

解决方案: 可以将message内容中CDATA里面的]]>替换为]]]]><![CDATA[>,替换后正确内容如下:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="ws.dis.clinical.viewigh.com">
   <soapenv:Header/>
   <soapenv:Body>
      <ws:req1>
         <!--Optional:-->
         <message>
<![CDATA[
         <Root>
<ROWKEY><![CDATA[0026|1242010044162664X7|000303786200|2|2336747&3|1242010044162664X7.EMR]]]]><![CDATA[></ROWKEY>
]]>
       </Root>
         </message>
      </ws:operationRequest>
   </soapenv:Body>
</soapenv:Envelope>

2. webservice 请求报错不允许有匹配 "[xX][mM][lL]" 的处理指令目标

错误信息如下:

Caused by: org.xml.sax.SAXParseException; systemId: file://; lineNumber: 4; columnNumber: 6; 不允许有匹配 "[xX][mM][lL]" 的处理指令目标。
	at java.xml/com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:204)
	at java.xml/com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:178)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1465)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLScanner.scanPIData(XMLScanner.java:745)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanPIData(XMLDocumentFragmentScannerImpl.java:1049)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLScanner.scanPI(XMLScanner.java:713)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:891)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:605)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:534)
	at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:888)
	at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:824)
	at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
	at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1216)
	at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:635)
	at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3422)

解决方案说明: 在webservice中,正确的soap请求格式如下

	<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="dis.ws.vh.com">
   <soapenv:Header/>
   <soapenv:Body>
      <ws:req1> <!-- 这里默认是接口中的方法名称  -->
         <!--Optional:-->
         <message>  <!-- 这里是请求参数名称 -->
<![CDATA[
        
<!-- type: EnsLib.EDI.XML.Document  id: 22938 -->
<POOR_IN200901UV xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:hl7-org:v3" ITSVersion="XML_1.0" xsi:schemaLocation="urn:hl7-org:v3 ../../Schemas/POOR_IN200901UV13.xsd">
	...
</POOR_IN200901UV>


]]>
         </message>
      </ws:req1>
   </soapenv:Body>
</soapenv:Envelope>

<![CDATA[ ]]>数据中间,不允许存在xml定义说明,也就是<?xml version="1.0"?> 本次的错误就是由于存在xml标记引起的。