点击数:8

前言

Spring3支持JSR-303验证框架,JSR-303 是Java EE 6 中的一项子规范,叫做BeanValidation,官方参考实现是hibernate Validator(与Hibernate ORM 没有关系),JSR 303 用于对Java Bean 中的字段的值进行验证。
Spring Boot在内部通过集成hibernate-validation已经实现了JSR-349验证规范接口,在Spring Boot项目中只要直接使用就行了。
一般用在Controller中用于验证前端传来的参数。

与springboot结合配置

1. bean 中添加标签

标签需要加在属性上

public class User {
    private Integer id;
    @NotBlank(message = "{user.name.notBlank}")
    private String name;
    private String username;
}

2. Controller中开启验证

@RequestMapping(method = RequestMethod.POST)
public User create(@RequestBody @Validated User user) {
    return userService.create(user);
}

@RequestMapping(method = RequestMethod.GET)
public User  getUserById(@NotNull(message = "id不能为空")  int userId)  {
    return userService.getUserById(userId);
}

3. resource 下新建错误信息配置文件

message信息可以配置在标签后面,也可以在resource目录下新建提示信息配置文件ValidationMessages.properties这样可以全局统一管理错误消息。

注意:名字必须为ValidationMessages.properties因为SpringBoot自动读取classpath中的ValidationMessages.properties里的错误信息。
ValidationMessages.properties文件的编码为ASCII。数据类型为key-valuekey"user.name.notBlank"为第一步bean的标签 大括号里面对应message的值;
value为提示信息 ,但是是ASCII

4. 统一异常处理,捕获错误信息

//全局异常捕捉处理
@ControllerAdvice
public class CustomExceptionHandler {

    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public Map errorHandler(Exception ex) {
        Map map = new HashMap();
        map.put("code", 400);
        //判断异常的类型,返回不一样的返回值
        if(ex instanceof MissingServletRequestParameterException){
            map.put("msg","缺少必需参数:"+((MissingServletRequestParameterException) ex).getParameterName());
        }
        else if(ex instanceof MyException){
            map.put("msg","这是自定义异常");
        } else if (ex instanceof BindException) {// 统一验证处理
            BindingResult bindingResult = ((BindException) ex).getBindingResult();
            List<ObjectError> errors = bindingResult.getAllErrors();
            StringBuffer buffer = new StringBuffer();
            errors.stream().forEach(x -> buffer.append(x.getDefaultMessage()).append(";"));
            map.put("msg", buffer.toString());
        }
        return map;
    }
}

5. 附上部分标签含义

Bean Validation 中内置的 constraint

注解作用
@Valid被注释的元素是一个对象,需要检查此对象的所有字段值
@Null被注释的元素必须为 null
@NotNull被注释的元素必须不为 null
@AssertTrue被注释的元素必须为 true
@AssertFalse被注释的元素必须为 false
@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min)被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past被注释的元素必须是一个过去的日期
@Future被注释的元素必须是一个将来的日期
@Pattern(value)被注释的元素必须符合指定的正则表达式

Hibernate Validator 附加的 constraint

使用validation注解时上下两种都可以直接使用

注解作用
@Email被注释的元素必须是电子邮箱地址,数值为null时不验证
@Length(min=, max=)被注释的字符串的大小必须在指定的范围内
@NotEmpty被注释的字符串的必须非空
@Range(min=, max=)被注释的元素必须在合适的范围内
@NotBlank被注释的字符串的必须非空
@URL(protocol=,host=, port=,regexp=, flags=)被注释的字符串必须是一个有效的url
@CreditCardNumber被注释的字符串必须通过Luhn校验算法,银行卡,信用卡等号码一般都用Luhn计算合法性
@ScriptAssert(lang=, script=, alias=)要有Java Scripting API 即JSR 223("Scripting for the JavaTM Platform")的实现
@SafeHtml(whitelistType=,additionalTags=)classpath中要有jsoup包

6.补充

hibernate补充的注解中,最后3个不常用,可忽略。

主要区分下@NotNull @NotEmpty @NotBlank 3个注解的区别:

@NotNull 任何对象的value不能为null

@NotEmpty 集合对象的元素不为0,即集合不为空,也可以用于字符串不为null

@NotBlank 只能用于字符串不为null,并且字符串trim()以后length要大于0

hibernate注解详细


心之所向,素履前往 ;生之逆旅,一苇以航 .