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";
}
浙公网安备 33010602011771号