首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring MVC 學習筆記 (14) - 服務端校驗框架整合與分組校驗實戰

     編輯:Java 綜合教學

Spring MVC 數據校驗:從環境搭建到分組校驗最佳實踐

前端 JS 校驗可繞過,服務端校驗是數據安全的最後防線。Spring MVC 整合 Hibernate Validator(JSR-303 實現),提供聲明式校驗能力,讓 Controller 專注業務邏輯。

校驗架構理解

  • 控制層:校驗請求參數合法性(必填、長度、格式),面向所有客戶端。
  • 業務層:校驗關鍵業務規則(如餘額充足、狀態流轉),核心邏輯保護。
  • 持久層:通常不做業務校驗,依賴數據庫約束。

環境準備與 Maven 依賴

僅需引入 hibernate-validator,傳遞依賴會自動包含 validation-api 與 jboss-logging:

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>5.2.4.Final</version>
</dependency>

校驗器配置

在 spring-mvc.xml 中定義 LocalValidatorFactoryBean 並指定錯誤訊息資源文件:

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
  <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
  <property name="validationMessageSource" ref="messageSource" />
</bean>

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
  <property name="basenames">
    <list><value>classpath:CustomValidationMessages</value></list>
  </property>
  <property name="fileEncodings" value="utf-8" />
  <property name="cacheSeconds" value="120" />
</bean>

<mvc:annotation-driven validator="validator" />

CustomValidationMessages.properties 定義錯誤碼與提示:

items.name.length.error=請輸入 1 到 30 個字符的商品名稱
items.createtime.isNull=請輸入商品的生產日期

POJO 聲明式校驗規則

在 ItemsCustom 上使用 JSR-303 註解,message 引用資源文件鍵:

public class ItemsCustom {
    @Size(min=1, max=30, message="{items.name.length.error}")
    private String name;

    @NotNull(message="{items.createtime.isNull}")
    private Date createtime;
    // 其他字段、getter/setter
}

Controller 捕獲與頁面展示錯誤

參數前加 @Validated,緊跟 BindingResult 獲取錯誤詳情:

@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(Model model, @Validated ItemsCustom itemsCustom, BindingResult bindingResult) throws Exception {
    if (bindingResult.hasErrors()) {
        // 將錯誤列表傳給頁面
        model.addAttribute("allErrors", bindingResult.getAllErrors());
        return "items/editItems"; // 回顯表單頁
    }
    // 校驗通過業務邏輯
    return "success";
}

JSP 使用 JSTL 迭代顯示:

<c:if test="${not empty allErrors}">
  <c:forEach items="${allErrors}" var="error">
    <div class="error">${error.defaultMessage}</div>
  </c:forEach>
</c:if>

分組校驗:同一 POJO 不同場景不同規則

當同一 POJO 服務多個業務入口(如新增需校驗全部,修改只校驗名稱)時,使用分組機制:

  1. 定義分組接口(標記介面):
public interface ValidGroup1 {} // 僅校驗名稱長度
public interface ValidGroup2 {} // 僅校驗價格非空
  1. 註解指定分組:
@Size(min=1, max=30, message="{items.name.length.error}", groups = {ValidGroup1.class})
private String name;
  1. Controller 指定啟用分組:
@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(@Validated(ValidGroup1.class) ItemsCustom itemsCustom, BindingResult bindingResult) { ... }

這樣同一 POJO 可根據業務場景靈活切換校驗規則,避免創建大量相似 DTO 類。

總結

Spring MVC + Hibernate Validator 實現了校驗邏輯與業務代碼的解耦,配合統一異常處理與國際化訊息,是構建健壯 Web 應用的標準方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved