1. 程式人生 > 實用技巧 >SpringBoot - 11資料校驗

SpringBoot - 11資料校驗

SpringBoot - 11資料校驗

(1)技術特點

SpringBoot中使用 Hibernate-validator校驗框架

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

(2)校驗步驟

(2.1)在實體類新增校驗規則

public class User {

    @NotNull
    private Integer userid;

    @NotBlank
    private String username;

    @NotBlank
    private String sex;
    // ......
}

(2.2)在Controller中開啟校驗

@Controller
@RequestMapping("/user")
@Validated
public class UserController {

    @RequestMapping(
"/addUser") public String addUser(@Validated User user, BindingResult result){ if(result.hasErrors()){ List<ObjectError> list = result.getAllErrors(); for(ObjectError err: list){ FieldError fieldError = (FieldError) err; String fieldName
= fieldError.getField(); String msg = fieldError.getDefaultMessage(); System.out.println(fieldName +"\t" + msg); } return "addUsers"; } System.out.println(user); return "ok"; } }

(2.3)在檢視頁面中獲取提示資訊

<body>
<form th:action="@{/user/addUser}" method="post">
    <input type="text" name="username"><font color="red"><span th:errors="${user.username}"></span></font> <br/>
    <input type="text" name="sex"><font color="red"><span th:errors="${user.sex}"></span></font><br/>
    <input type="submit" value="OK">
</form>
</body>

(2.4)自定義錯誤提示資訊

(2.4.1)在註解中定義提示資訊

    private Integer userid;

    @NotBlank(message = "註解:姓名不能為空")
    private String username;

    @NotBlank(message = "註解:性別不能為空")
    private String sex;

(2.4.2)在配置檔案中定義提示資訊

配置檔案的名稱必須是ValidationMessages.properties,在templates下。

    private Integer userid;

    @NotBlank(message = "{username.notnull}")
    private String username;

    @NotBlankprivate String sex;

(2.4.3)解決亂碼問題:native2ascii.exe

userid.notnull=\u7528\u6237ID\u4e0d\u80fd\u4e3a\u7a7a
username.notnull=\u7528\u6237\u59d3\u540d\u4e0d\u80fd\u4e3a\u7a7a
sex.notnull=\u7528\u6237\u6027\u522b\u4e0d\u80fd\u4e3a\u7a7a

(2.5)屬性重新命名

    @RequestMapping("/addUser")
    public String addUser(@ModelAttribute("u")  @Validated User user, BindingResult result){
   <input type="text" name="username"><font color="red"><span th:errors="${u.username}"></span></font> <br/>
    <input type="text" name="sex"><font color="red"><span th:errors="${u.sex}"></span></font><br/>

(2.6)校驗規則

  • @NotNull: 判斷基本資料型別的物件型別是否為null
  • @NotBlank: 判斷字串是否為null或者空串(去掉首尾空格)
  • @NotEmpty: 判斷集合是否為空。
  • @Length: 判斷字元的長度(最大或最小)
  • @Min: 判斷數值最小值
  • @Max: 判斷數值最大值
  • @Email: 判斷郵箱是否合法。
    @NotBlank(message = "{username.notnull}")
    @Length(min = 3,max = 8)
    private String username;

(3)對Controller中其他引數進行校驗

(3.1)在Controller中開啟校驗

    @RequestMapping("/findUser")
    public String findUser(@NotBlank String username){
        System.out.println("username: ->" + username);
        return "ok";
    }

校驗報錯: console輸出

javax.validation.ConstraintViolationException: findUser.username: 不能為空

(3.2)通過全域性異常處理來跳轉頁面

@Configuration
public class GlobalException implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView mv = new ModelAndView();

        if(e instanceof ConstraintViolationException){
            mv.setViewName("findUser");
        }
        mv.addObject("error",e.getMessage());
        return mv;
    }
}
<body>
<form th:action="@{/user/findUser}" method="post">
    <input type="text" name="username"> <font color="red"><span th:text="${error}"></span></font><br/>
    <input type="submit" value="OK">
</form>
</body>

(3.2.1)對報錯資訊進行裁剪

        mv.addObject("error",e.getMessage().split(":")[1]);

(3.2.2)指定報錯資訊

    @RequestMapping("/findUser")
    public String findUser(@NotBlank(message = "使用者名稱不能為空")  String username){
        System.out.println("username: ->" + username);
        return "ok";
    }