SpringBoot - 11資料校驗
阿新 • • 發佈:2021-01-03
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"; }