Spring后端参数检验

VO:

package com.supcon.oms.controller.vo;

import lombok.Data;
import org.hibernate.validator.constraints.Length;

import java.io.Serializable;

/**
 * @author: zhaoxu
 * @date: 2020/9/9 9:42
 */
@Data
public class TTankVo implements Serializable {
     
    private static final long serialVersionUID = 4969052226883357109L;
    private Integer tankId;

    private String tankNo;

    private String equipmentType;

    private String tankName;
    
    @Length(min=0,max =1,message = "长度不能超过1")
    private String tankDescription;

    private String equipmentStatus;

    private String tankKeepwarm;

    private String tankStatus;

    private String tankFarmid;

    private String tankType;

    private Double tankDiameter;

    private Double tankHeight;

    private Double tankCapacityStandard;

    private Double liquidLevelTemperature;

    private Double tankCapacitySafe;
    private Integer omsSourceTarget;

    private Integer omsShare;

    private Integer omsShareDepth;

    private Integer omsOccupy;
}

一:在Controller方法参数前加@Valid注解——校验不通过时直接抛异常

    /**
 * 校验不通过时直接抛异常
 * @param user
 * @return
 */
@PostMapping("/test1")
public Object test1(@RequestBody @Valid User user) {
	return "操作成功!";
}

调用时会抛出一个org.springframework.web.bind.MethodArgumentNotValidException异常:

2019-04-21 11:35:28.600 WARN 10852 — [nio-8080-exec-4] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public java.lang.Object com.example.validation.UserController.test1(com.example.validation.User) with 3 errors: [Field error in object 'user' on field 'createTime': rejected value [Mon Dec 31 08:00:00 CST 2018]; codes [Future.user.createTime,Future.createTime,Future.java.util.Date,Future]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.createTime,createTime]; arguments []; default message [createTime]]; default message [需要是一个将来的时间]] [Field error in object 'user' on field 'age': rejected value [0]; codes [Min.user.age,Min.age,Min.java.lang.Integer,Min]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.age,age]; arguments []; default message [age],1]; default message [年龄不能小于1岁]] [Field error in object 'user' on field 'name': rejected value []; codes [NotBlank.user.name,NotBlank.name,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.name,name]; arguments []; default message [name]]; default message [姓名不能为空]] ]

★使用这种的话一般结合统一异常处理器(或者Aspect、拦截器等)处理★
Spring后端参数检验_第1张图片

二:在Controller方法参数前加@Valid注解,参数后面定义一个BindingResult类型参数——执行时会将校验结果放进bindingResult里面,用户自行判断并处理

    /**
 * 将校验结果放进BindingResult里面,用户自行判断并处理
 * @param user
 * @param bindingResult
 * @return
 */
@PostMapping("/test2")
public Object test2(@RequestBody @Valid User user, BindingResult bindingResult) {
	// 参数校验
	if (bindingResult.hasErrors()) {
		String messages = bindingResult.getAllErrors()
			.stream()
			.map(ObjectError::getDefaultMessage)
			.reduce((m1, m2) -> m1 + ";" + m2)
			.orElse("参数输入有误!");
		throw new IllegalArgumentException(messages);
	}
	
	return "操作成功!";
}
@Null	限制只能为null
@NotNull	限制必须不为null
@AssertFalse	限制必须为false
@AssertTrue	限制必须为true
@DecimalMax(value)	限制必须为一个不大于指定值的数字
@DecimalMin(value)	限制必须为一个不小于指定值的数字
@Digits(integer,fraction)	限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future	限制必须是一个将来的日期
@Max(value)	限制必须为一个不大于指定值的数字
@Min(value)	限制必须为一个不小于指定值的数字
@Past	限制必须是一个过去的日期
@Pattern(value)	限制必须符合指定的正则表达式
@Size(max,min)	限制字符长度必须在min到max之间
@Past	验证注解的元素值(日期类型)比当前时间早
@NotEmpty	验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank	验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email	验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
Hiberate Validator还支持以下注解

@Email	被注解的元素必须是电子邮箱地址
@Length	被注释的字符串大小必须在指定的范围内
@NotEmpty	注释的字符串必须非空
@Range	注释的元素必须在合适的范围内

你可能感兴趣的:(Spring后端参数检验)