2014-11-06 65 views
0

在這一天我已經在牆上撞了我的頭幾天。我們是 使用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?

回答

1

好了,所以做一些更多的研究,這個問題是不是春天的故障之後。似乎是 是Java中Sax解析方式的產物。

基本架構是Spring-> JAXP-> Parser Provider(Xerces)。

JAXP接口允許設置功能,但不提供必要的 控件來替換Xerces解析器中的ErrorReporter組件,也不對 進行定製。自定義將涉及使用自定義ErrorReporter組件構建Xerces分析器實例 並覆蓋作爲JVM一部分的Xerces實現 。

當我們試圖在我們可能無法控制的環境中在JVM的頂部提供產品 時,這根本不是可行的選擇。底線是,我們有 與他們的方式生活的消息。