spring boot validation参数校验实例分析

本文实例讲述了spring boot validation参数校验。分享给大家供大家参考,具体如下:

对于任何一个应用而言在客户端做的数据有效性验证都不是安全有效的,这时候就要求我们在开发的时候在服务端也对数据的有效性进行验证。 Spring Boot自身对数据在服务端的校验有一个比较好的支持,它能将我们提交到服务端的数据按照我们事先的约定进行数据有效性验证。

1 pom依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2 校验使用实例

  • 配置要验证的请求实体
public class User {
  @Null
  private Long id;
  @NotBlank
  private String name;
  @Email
  private String email;
  // 省略getter和setter
}
  • 控制器方法配置
@PostMapping("/addUser")
public String addUser(@Valid @RequestBody User user){
  ...
}
  • 校验失败统一处理

校验失败时将抛出MethodArgumentNotValidException异常

/**
 * 全局Exception处理
 *
 * @author liusq
 *
 */
@RestControllerAdvice
public class GlobalExceptionHandler {
  private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionHandler.class);
  @SuppressWarnings("rawtypes")
  @ExceptionHandler(value = Exception.class)
  public ResponseEntity handle(Exception e) {
    if (e instanceof MethodArgumentNotValidException) {
      BindingResult bindingResult = ((MethodArgumentNotValidException) e).getBindingResult();
      if (bindingResult.hasErrors() && bindingResult.hasFieldErrors()) {
        FieldError fieldError = bindingResult.getFieldError();
        BodyValidStatus bodyValidStatus = new BodyValidStatus.Builder().code("0009")
            .message(fieldError.getDefaultMessage())
            .field(fieldError.getField()).build();
        LOGGER.warn(bodyValidStatus.getMessage() + e);
        return new ResponseEntity<>(bodyValidStatus, HttpStatus.OK);
      } else {
        bodyStatus = DataUtil.bodyStatus("0009");
      }
    } else {
      bodyStatus = DataUtil.bodyStatus(Constants.ERROR_CODE);
    }
    LOGGER.error(bodyStatus.getMessage() + e);
    return new ResponseEntity<>(bodyStatus, HttpStatus.OK);
  }
}
public class BodyValidStatus {
  // 错误代码
  private String code;
  // 错误代码解释
  private String message;
  // 错误字段
  private String field;
  public BodyValidStatus() {
  }
  public BodyValidStatus(String code, String message, String field) {
    this.code = code;
    this.message = message;
    this.field = field;
  }
  private BodyValidStatus(Builder builder) {
    setCode(builder.code);
    setMessage(builder.message);
    setField(builder.field);
  }
  public String getCode() {
    return code;
  }
  public void setCode(String code) {
    this.code = code;
  }
  public String getMessage() {
    return message;
  }
  public void setMessage(String message) {
    this.message = message;
  }
  public String getField() {
    return field;
  }
  public void setField(String field) {
    this.field = field;
  }
  @Override
  public String toString() {
    return ToStringBuilder.reflectionToString(this);
  }
  public static final class Builder {
    private String code;
    private String message;
    private String field;
    public Builder() {
    }
    public Builder code(String val) {
      code = val;
      return this;
    }
    public Builder message(String val) {
      message = val;
      return this;
    }
    public Builder field(String val) {
      field = val;
      return this;
    }
    public BodyValidStatus build() {
      return new BodyValidStatus(this);
    }
  }
}

3 验证注解详解


验证注解


验证的数据类型


说明


空检查


@Null


任意类型


验证注解的元素值是null


@NotNull


任意类型


验证注解的元素不是null


@NotBlank


CharSequence子类型(CharBuffer、String、StringBuffer、StringBuilder)


验证注解的元素值不为空(不为null、去除首尾空格后长度不为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的首尾空格


@NotEmpty


CharSequence子类型、Collection、Map、数组


验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)


Boolean检查


@AssertFalse


Boolean,boolean


验证注解的元素值是false


@AssertTrue


Boolean,boolean


验证注解的元素值是true


长度检查


@Size(min=下限, max=上限)


字符串、Collection、Map、数组等


验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小


@Length(min=下限, max=上限)


CharSequence子类型


验证注解的元素值长度在min和max区间内


日期检查


@Past


java.util.Date,java.util.Calendar;Joda Time类库的日期类型


验证注解的元素值(日期类型)比当前时间早


@Future


与@Past要求一样


验证注解的元素值(日期类型)比当前时间晚


数值检查


@MIN(value=值)


BigDecimal,BigInteger, byte,short, int, long,等任何Number或CharSequence(存储的是数字)子类型


验证注解的元素值大于等于@Min指定的value值


@MAX(value=值)


和@Min要求一样


验证注解的元素值小于等于@Max指定的value值


@DecimalMin(value=值)


和@Min要求一样


验证注解的元素值大于等于@ DecimalMin指定的value值


@DecimalMax(value=值)


和@Min要求一样


验证注解的元素值小于等于@ DecimalMax指定的value值


@Digits(integer=整数位数, fraction=小数位数)


和@Min要求一样


验证注解的元素值的整数位数和小数位数上限


@Range(min=最小值, max=最大值)


BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子类型和包装类型


验证注解的元素值在最小值和最大值之间


其他检查


@Valid


任何非原子类型


指定递归验证关联的对象;如用户对象中有个地址对象属性,如果想在验证用户对象时一起验证地址对象的话,在地址对象上加@Valid注解即可级联验证


@Pattern(regexp=正则表达式,flag=标志的模式)


CharSequence的子类型


验证注解的元素值与指定的正则表达式匹配


@Email(regexp=正则表达式,flag=标志的模式)


CharSequence的子类型


验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式


@CreditCardNumber


CharSequence的子类型


验证注解元素值是信用卡卡号


@ScriptAssert(lang= ,script=)


业务类


校验复杂的业务逻辑

4 自定义验证注解和验证规则

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
import com.xxx.xxx.constraint.impl.MoneyValidator;
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=MoneyValidator.class)
public @interface Money {
  String message() default"不是金额形式";
  Class<?>[] groups() default {};
  Class<? extends Payload>[] payload() default {};
}
import java.util.regex.Pattern;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import com.xxx.xxx.constraint.Money;
public class MoneyValidator implements ConstraintValidator<Money, Double> {
  private String moneyReg = "^\\d+(\\.\\d{1,2})?$";//表示金额的正则表达式
  private Pattern moneyPattern = Pattern.compile(moneyReg);
  public void initialize(Money money) {
    // TODO Auto-generated method stub
  }
  public boolean isValid(Double value, ConstraintValidatorContext arg1) {
    // TODO Auto-generated method stub
    if (value == null)
      return true;
    return moneyPattern.matcher(value.toString()).matches();
  }
}

更多关于java相关内容感兴趣的读者可查看本站专题:《Spring框架入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • springboot+dubbo+validation 进行rpc参数校验的实现方法

    注意:本文dubbo 版本 2.8.4 springboot 版本 2.0.4.RELEASE 项目结构 test-rest (前端消费着,controller 层,springboot+maven项目) test-api (dubbo服务 的 api ,只记录 service 接口和 model ,maven 项目) test-provider(dubbo 服务提供者,实际的数据库操作及业务层, springboot+maven项目 ) 背景: 使用springmvc做restful,使用du

  • springboot使用Validator校验方式

    我相信每个做开发的都听过这句"永远不要相信用户的输入",因此后台需要对用户的每个输入项都做校验:手机号.用户名.密码.邮箱.身份证号······这时候就需要hibernate-Validator校验框架登场了,下面介绍springboot如何使用hibernate-Validator进行校验. 引入pom WAIT ~~~ starter-web的依赖 惊不惊喜,意不意外?springboot已帮我们集成了,我们只管拿!来!用! 添加注解 @NotBlank(message = &qu

  • Spring boot进行参数校验的方法实例详解

    Spring boot开发web项目有时候我们需要对controller层传过来的参数进行一些基本的校验,比如非空.整数值的范围.字符串的长度.日期.邮箱等等.Spring支持JSR-303 Bean Validation API,可以方便的进行校验. 使用注解进行校验 先定义一个form的封装对象 class RequestForm { @Size(min = 1, max = 5) private String name; public String getName() { return n

  • SpringBoot全局异常与数据校验的方法

    异常处理是每个项目中都绕不开的话题,那么如何优雅的处理异常,是本文的话题.本文将结合SpringBoot框架一起和大家探讨下. 要思考的问题 在现在的前后端交互中,通常都规范了接口返回方式,如返回的接口状态(成功|失败)以及要返回的数据在那个字段取,或者说失败了以后提示信息从接口哪里返回,因此,如果想做全局异常,并且异常发生后能准确的返回给前端解析,那么需要异常发生时返回给前端的格式与正常失败场景的格式一致. 项目建立 利用idea 工具,很容易的搭建一个SpringBoot项目,要引入的mav

  • springboot使用hibernate validator校验方式

    一.参数校验 在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大的代码个人感觉有两个麻烦: 验证代码繁琐,重复劳动 方法内代码显得冗长 每次要看哪些参数验证是否完整,需要去翻阅验证逻辑代码 hibernate validator(官方文档)提供了一套比较完善.便捷的验证实现方式. spring-boot-starter-web包里面有hibernate-validator包,不需要引用hibernate validator依赖. 二.hi

  • Springboot集成JSR303参数校验的方法实现

    JSR303 是一套 JavaBean 参数校验的标准 1.pom导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> 2.注解类型 (1)空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null,

  • SpringBoot 使用hibernate validator校验

    本文将全面的介绍如何使用 validator 进行数据校验 本文源码: https://gitee.com/yintianwen7/taven-springboot-learning/tree/master/springboot-validate 准备工作 我们只需要引入 spring-boot-starter-web 包即可使用 1.常用注解 常用注解 2.简单的实体校验 public class CardDTO { @NotBlank private String cardId; @Size

  • 详解如何在Spring Boot项目使用参数校验

    开发web项目有时候我们需要对controller层传过来的参数进行一些基本的校验,比如非空,非null,整数值的范围,字符串的个数,日期,邮箱等等.最常见的就是我们直接写代码校验,这样以后比较繁琐,而且不够灵活. Bean Validation 1.0(JSR-303)是一个校验规范,在spring Boot项目由于自带了hibernate validator 5(http://hibernate.org/validator/)实现,所以我们可以非常方便的使用这个特性 . 核心的pom依赖:

  • Spring Boot实现通用的接口参数校验

    本文介绍基于 Spring Boot 和 JDK8 编写一个 AOP ,结合自定义注解实现通用的接口参数校验. 缘由 目前参数校验常用的方法是在实体类上添加注解,但对于不同的方法,所应用的校验规则也是不一样的,例如有一个 AccountVO 实体: public class AccountVO { private String name; // 姓名 private Integer age; // 年龄 } 假设存在这样一个业务:用户注册时需要填写姓名和年龄,用户登陆时只需要填写姓名就可以了.那

  • springboot使用校验框架validation校验的示例

    b/s系统中对http请求数据的校验多数在客户端进行,这也是出于简单及用户体验性上考虑,但是在一些安全性要求高的系统中服务端校验是不可缺少的. Spring3支持JSR-303验证框架,JSR-303 是Java EE 6 中的一项子规范,叫做BeanValidation,官方参考实现是hibernate Validator(与Hibernate ORM 没有关系),JSR 303 用于对Java Bean 中的字段的值进行验证. Validator主要是校验用户提交的数据的合理性的,比如是否为

  • Spring Boot 参数校验的具体实现方式

    1.背景介绍 开发过程中,后台的参数校验是必不可少的,所以经常会看到类似下面这样的代码 这样写并没有什么错,还挺工整的,只是看起来不是很优雅而已. 接下来,用Validation来改写这段 2.Spring Boot文档中的Validation 在Spring Boot的官网中,关于Validation只是简单的提了一句,如下 其实,Spring Validator和Hibernate Validator是两套Validator,可以混着用,这里我们用Hibernate Validator 3.

随机推荐