博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

SpringBoot - 11数据校验

Posted on 2021-01-03 17:10  Kingdomer  阅读(90)  评论(0)    收藏  举报

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";
    }