2016-06-13 15 views
3

我正在閱讀Spring 4 API,我試圖瞭解FieldErrorObjectError和全局錯誤之間的差異,全部在BindingResult的上下文中。我猜測全局錯誤是ObjectError s的另一個名稱,因爲getGlobalError()返回ObjectErrorFieldError與ObjectError與全局錯誤

上下文是,我正在尋找簡單的打印錯誤消息後,一些表單驗證,並希望知道我可以如何避免檢查instanceof,如在this accepted answer。我可以只使用FieldError並忽略對象錯誤嗎?如果我只記錄FieldError s,我會丟失什麼?

我已經嘗試了幾個方案,但還沒有看到區別。在此期間將通過一些源頭查看。

回答

1

我猜測全局錯誤是ObjectErrors的另一個名字 因爲getGlobalError()返回一個ObjectError。

其實「全局錯誤」是任何ObjectError這是不是一個FieldError的實例看getGlobalErrors()

什麼會我丟失,如果我只登錄FieldErrors source

任何ObjectError如果代碼註冊爲「全局錯誤」,例如通過呼籲BindingResult.reject(errorCode, errorArgs, defaultMessage)

另請參閱javadocrejectValue(field, errorCode, errorArgs, defaultMessage)。通常,錯誤是根據驗證/綁定對象的字段(例如,其屬性與Spring表單標記的modelAttribute標記匹配的模型值)而不是對象本身進行註冊的。

以下是幾種方法來創建全局錯誤:

  1. 假設它的根表單對象,而不是多數民衆贊成被通過Spring Validator implementation驗證一個嵌套的對象,您可以添加一個「全球性的錯誤」(以指定的綁定根對象的上下文)通過傳遞null作爲字段名稱參數rejectValue。但是,如果要驗證的對象是嵌套對象,則將針對嵌套對象字段註冊FieldError。因此,關於是否添加了常規的ObjectError或特定的FieldError,目標Errors對象的nestedPath(「嵌套對象圖」)屬性至關重要。

  2. 通過在類級應用的JSR 303約束註釋。請參閱example,其中檢查模型對象是否存在於數據存儲中。

下面是一個例子,以引用全球VS現場級錯誤:

然後顯示在視圖中含有全球和字段的錯誤該標籤:

<spring-ext:overflowErrors name="newModelObject"> 
     <div class="row"> 
      <div class="large-12 columns"> 
       <div class="alert panel"> 
        <c:if test="${overflowErrors.size()>0}"> 
         <p>There are multiple errors with your entry.</p> 
         <c:forEach var="error" items="${overflowErrors}"> 
          ${fn:toUpperCase(fn:substring(error.field, 0, 1))}${fn:toLowerCase(
          fn:substring(error.field, 1,fn:length(error.field)))}: 
          <b><spring:message message="${error}" /></b> 
          <br/> 
         </c:forEach> 
        </c:if> 
        <c:forEach var="error" items="${globalErrors}"> 
         <b><spring:message message="${error}" /></b> 
         <br/> 
        </c:forEach> 
       </div> 
      </div> 
     </div> 
    </spring-ext:overflowErrors>