文章目录
SpringBoot参数校验validation
依赖
<!-- 参数校验-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
controller
/**
* 添加品牌
*
* @param brand
* @return
*/
@PostMapping("add")
public Result addBrand(@Validated(AddGroup.class) @RequestBody Brand brand) {
brandService.save(brand);
return Result.success();
}
javaBean
package com.hngc.product.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.common.valid.AddGroup;
import com.common.valid.UpdateGroup;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.validator.constraints.URL;
import javax.validation.constraints.*;
import java.io.Serializable;
/**
* <p>
* 品牌
* </p>
*/
@Getter
@Setter
@TableName("pms_brand")
@ApiModel(value = "Brand对象", description = "品牌")
public class Brand implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("品牌id")
@TableId(value = "brand_id", type = IdType.AUTO)
@Null(message = "id必须为空", groups = AddGroup.class)
@NotNull(message = "id不能为空", groups = UpdateGroup.class)
private Long brandId;
@ApiModelProperty("品牌名")
@NotBlank(message = "品牌名不能为空",groups = {AddGroup.class, UpdateGroup.class})
private String name;
@ApiModelProperty("品牌logo地址")
@NotNull(groups = {AddGroup.class, UpdateGroup.class})
@URL(message = "logo地址非法",groups = {AddGroup.class, UpdateGroup.class})
private String logo;
@ApiModelProperty("介绍")
private String descript;
@ApiModelProperty("显示状态[0-不显示;1-显示]")
private Byte showStatus;
@ApiModelProperty("检索首字母")
@NotNull(groups = {AddGroup.class, UpdateGroup.class})
@Pattern(regexp = "[a-zA-Z]", message = "必须为字母",groups = {AddGroup.class, UpdateGroup.class})
private String firstLetter;
@ApiModelProperty("排序")
@NotNull(groups = {AddGroup.class, UpdateGroup.class})
@Min(value = 0,groups = {AddGroup.class, UpdateGroup.class})
private Integer sort;
@ApiModelProperty("逻辑删除[0-未删除;1-已删除]")
@TableLogic
@Null(groups = {AddGroup.class, UpdateGroup.class})
private Integer isDelete;
}
分组
package com.common.valid;
public interface AddGroup {
}
package com.common.valid;
public interface UpdateGroup {
}
自定义校验注解
package com.common.valid;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Documented
//校验器
@Constraint(validatedBy = {ListValueConstraintValidator.class})
public @interface ListValue {
String message() default "{com.common.valid.ListValue.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
int[] values() default {0, 1};
}
自定义校验规则
package com.common.valid;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;
/**
* 自定义注解校验器
*/
public class ListValueConstraintValidator implements ConstraintValidator<ListValue, Integer> {
private static final Set<Integer> set=new HashSet<>();
/**
* 初始化方法
*
* @param constraintAnnotation
*/
@Override
public void initialize(ListValue constraintAnnotation) {
for (int value : constraintAnnotation.values()) {
set.add(value);
}
}
/**
* 实现验证逻辑
*
* @param value 要验证的对象
* @param context
* @return
*/
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
return set.contains(value);
}
}
javaBean
@ApiModelProperty("显示状态[0-不显示;1-显示]")
@ListValue(groups = {AddGroup.class, UpdateGroup.class})
private Integer showStatus;
ValidationMessages.properties
com.common.valid.ListValue.message = 必须为指定值
测试结果
{
"msg": "操作失败",
"code": 500,
"data": {
"brandId": "id必须为空",
"name": "品牌名不能为空",
"logo": "不能为null",
"sort": "不能为null",
"firstLetter": "不能为null"
}
}
注解 | 功能 |
@AssertFalse | 可以为null,如果不为null的话必须为false |
@AssertTrue | 可以为null,如果不为null的话必须为true |
@DecimalMax | 设置不能超过最大值 |
@DecimalMin | 设置不能超过最小值 |
@Digits | 设置必须是数字且数字整数的位数和小数的位数必须在指定范围内 |
@Future | 日期必须在当前日期的未来 |
@Past | 日期必须在当前日期的过去 |
@Max | 最大不得超过此最大值 |
@Min | 最大不得小于此最小值 |
@NotNull | 不能为null,可以是空 |
@Null | 必须为null |
@Pattern | 必须满足指定的正则表达式 |
@Size | 集合、数组、map等的size()值必须在指定范围内 |
必须是email格式 | |
@Length | 长度必须在指定范围内 |
@NotBlank | 字符串不能为null,字符串trim()后也不能等于“” |
@NotEmpty | 不能为null,集合、数组、map等size()不能为0;字符串trim()后可以等于“” |
@Range | 值必须在指定范围内 |
@URL | 必须是一个URL |