我正在开发一些基于Web服务的应用程序,我有一个关于Apache CXF解组的问题.在我们的项目中,我们使用CXF 2.4.1版本.
当某些SOAP请求不正确时(例如某些字段是文本而不是数字),CXF会抛出标准的SOAPFaultException,并使用以下标准字段构建SOAP响应:
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>Unmarshalling Error: some field missing</faultstring>
</soap:Fault>
Run Code Online (Sandbox Code Playgroud)
项目要求说,如果出现任何故障,系统需要以其他格式响应,例如:
<soap:body>
<ResponseState>
<ErrorCode>2732</ErrorCode>
<ErrorMessage>Unmarshalling Error: some field missing</ErrorMessage>
<ErrorDetails> some details </ErrorDetails>
<some other fields>
...
</ResponseState>
</soap:body>
Run Code Online (Sandbox Code Playgroud)
所以问题是:如何以某种方式覆盖此错误处理并以我的格式响应,而不是默认?
提前致谢.
PS我试图查看一些ValidationEventHandler主体,但它在CXF 2.0及更高版本中以其他方式工作.
我对JAXB和验证都不熟悉,并花了几个小时试图弄清楚这个问题无济于事.我创建了一个简单的JAXB unmarshaller示例来解析XML文件.我也创建了一个合适的XSD文件,但验证器一直在抱怨它无法找到元素的声明.
我认为它可能与命名空间问题有关,但我已经尝试了我能想到的一切,但似乎仍无法解决错误.据我所知,我的XSD和XML是正确的,所以它可能与我实例化unmarshaller的方式有关,但我似乎无法在任何地方找到问题.
我一直得到的错误/异常是:
Caused by: org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'calculateBorrowingDataResponse'.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
at org.apache.xerces.jaxp.validation.ValidatorHandlerImpl.startElement(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.ValidatingUnmarshaller.startElement(ValidatingUnmarshaller.java:85)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:47)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:113)
at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:236)
at com.sun.xml.internal.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:119)
at com.sun.xml.internal.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:102)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:299)
... 2 more
Run Code Online (Sandbox Code Playgroud)
以下是导致错误的源文件.
Java代码:
// We need a Document
InputStream is = UnmarshalTest.class.getClassLoader().getResourceAsStream("calculateBorrowingDataResponse.xml");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Node node = db.parse(is);
// Creating an unmarshaller …Run Code Online (Sandbox Code Playgroud)