在這一天我已經在牆上撞了我的頭幾天。我們是 使用Spring Web服務2.1.3.RELEASE和我已經添加了一個簡單的子類 PayloadValidatingInterceptor捕獲XSD架構驗證錯誤。在Spring PayloadValidatingInterceptor中替換XML MessageFormatter
配置:
<bean id="xsdValidationInterceptor" class="foo.bar.endpoint.interceptors.XSDValidatingInterceptor">
<property name="schemas">
<list>
<value>classpath:/xsd/requestName.xsd</value>
</list>
</property>
<property name="validateRequest" value="true"/>
<property name="validateResponse" value="true"/>
</bean>
XsdValidationInterceptor覆蓋handleRequestValidationErrors:
@Override
protected boolean handleRequestValidationErrors(
MessageContext messageContext, SAXParseException[] errors)
throws TransformerException {
if (getAddValidationErrorDetail()) {
messageContext.setProperty(MessageContextConstants.KEY_SCHEMA_ERRORS, errors);
}
return true;
}
到目前爲止好。此問題是從Xerces解析器 返回的消息的格式。問題是,我想要發生錯誤的 的字段名稱和行/列號碼不需要從長字符串中挖掘出來,該字符串對於各種錯誤而言是不同的。似乎它應該很簡單,但春天並沒有使這個容易。一旦錯誤出現在handleRequestValidationErrors 例程中,異常消息已經被格式化了。
具體而言,我想要替換XMLErrorReporter 或XMLErrorReporter在Spring創建的模式驗證程序 中使用的MessageFormatter。 Xerces爲取代 錯誤記者提供了一個標準屬性;然而,Spring並沒有讓這個容易。它使用名爲Jaxp13ValidatorFactory的硬編碼JAXP工廠創建 XMLValidator對象,該對象基本上在每個請求處理中創建了一個 Xerces驗證程序。 XMLValidator不允許設置 創建的驗證器實現的屬性。
我看過的Xerces的自定義配置以及其他 可能的黑客攻擊,並在這一點上,我能想到的唯一的事情就是 覆蓋的handleRequest常規的XsdValidationInterceptor 創建自己的驗證,我可以根據需要配置。
有人有什麼更好的點子嗎?
這是在這裏問同樣的問題,但遺憾的是沒有回答:
How can I provide custom error messages using JAXP DocumentBuilder?