SpringBoot-MVC之验证框架JSR

1、SpringBoot支持JSR-303Bean验证框架,默认使用Hibernate validator。在springMvc中,只需要使用注解标注在方法参数中,SpringBoot可对参数对象进行校验,校验结果放在BindingResult中。

2、JSR-303

       (1)JSR-303是java标准的验证框架,已有的实现由Hibernate validate。常用注解有以下几种

空检查

    @Null 验证对象是否为空

    @NotNull 验证对象不为空

    @NotBlank 验证不为空字符串,""和" "都会失败

    @NotEmpty 验证对象不为null,或者集合不为空

长度检查

@Size(min = ,max = )验证对象长度,可支持字符串、集合
@Length 字符串大小

数值检测

  @Min验证是否大于等于指定的值

@Max验证是否小于等于指定的值

@Digits验证是否符合指定格式,如@Digits(integer=9,fraction=2)

@Range验证是否在指范围内,如@range(min=1,max=1000)

其他

@Email,验证是否为邮件格式,为null不做校验

@Pattern,验证String是否符合正则表达式

(2)在一些其他的应用场景,不同的业务逻辑会有不同的业务需求,比如当更新的时候,id必须为null,但增加的时候,id必须为null。

   在JSR-303中定义了group,每个校验注解必须支持。可以匹配一个或者多个group

(3)使用场景

package com.blog.pojo;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import javax.validation.constraints.Pattern;

/**
 * @author admin
 * @date 2018/10/9
 */

public class TbItemCatModel {

    public interface Add {
    }

    public interface Update {
    }

    @Null(groups = {Add.class})
    @NotNull(groups = Update.class)
    private Long id;
@
    private Long parentId;
    @Pattern(regexp = "0-9a-zA-Z", message = "只能为字母或数字")
    private String name;
    private Long TypeId;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getParentId() {
        return parentId;
    }

    public void setParentId(Long parentId) {
        this.parentId = parentId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getTypeId() {
        return TypeId;
    }

    public void setTypeId(Long typeId) {
        TypeId = typeId;
    }
}

(2)contronller拦截

@RequestMapping(value = "/addItemCat")
public void addItemCat(@Validated({TbItemCatModel.Update.class}) TbItemCatModel itemCatModel, BindingResult result) {
    if (result.hasErrors()) {
        List<ObjectError> allErrors = result.getAllErrors();
        FieldError fieldError = (FieldError) allErrors.get(0);
        System.out.println(fieldError.getObjectName() + fieldError.getField() + fieldError.getDefaultMessage());
        return;
    }
    return;

}

3、自定义校验

(1)

package com.blog.annotion;


import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

//Constraint表示用什么类作为注解实现类
@Constraint(validatedBy = {WorkTimeValidator.class})

@Documented
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface WorkOverTime {
    //用于创建错误信息,
    String message() default "加班时间过长,不能超过{max}小时";

    int max() default 5;

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default{};

}

(2)

package com.blog.annotion;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * @author admin
 * @date 2018/10/30
 */

public class WorkTimeValidator implements ConstraintValidator<WorkOverTime, Integer> {
    WorkOverTime work;
    int max;

    @Override
    public void initialize(WorkOverTime work) {
        this.work = work;
        max=work.max();
    }

    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        if (value == null) {
            return true;
        }
        return value < max;

    }
}
(3)
package com.blog.pojo;

import com.blog.annotion.WorkOverTime;
import org.apache.ibatis.annotations.Update;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import javax.validation.constraints.Pattern;

/**
 * @author admin
 * @date 2018/10/9
 */

public class TbItemCatModel {

    /*public interface Add {
    }

    public interface Update {
    }

    @Null(groups = {Add.class})*/
    @NotNull//(groups = Update.class)
    private Long id;

    private Long parentId;
    @Pattern(regexp = "0-9a-zA-Z", message = "只能为字母或数字")
    private String name;
    private Long TypeId;
    @WorkOverTime(max=2)
    private int workTime;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getParentId() {
        return parentId;
    }

    public void setParentId(Long parentId) {
        this.parentId = parentId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getTypeId() {
        return TypeId;
    }

    public void setTypeId(Long typeId) {
        TypeId = typeId;
    }

    public int getWorkTime() {
        return workTime;
    }

    public void setWorkTime(int workTime) {
        this.workTime = workTime;
    }
}

(4)

@RequestMapping(value = "/addItemCat")
public void addItemCat(@Validated
                       @RequestBody TbItemCatModel itemCatModel, BindingResult result) {
    if (result.hasErrors()) {
        List<ObjectError> allErrors = result.getAllErrors();
        FieldError fieldError = (FieldError) allErrors.get(0);
        System.out.println(fieldError.getObjectName() + fieldError.getField() + fieldError.getDefaultMessage());
        return;
    }
    return;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值