前言
在日常的开发中可能会对手机号、邮箱、身份证号的合法性进行校验,然而每次使用if语句调用校验函数进行校验又显得过于麻烦,这时候自定义校验注解用处就很大了。此文编写一个对应0,1值的校验。
1、引入依赖
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
2、自定义校验注解
package com.atguigu.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.RetentionPolicy.RUNTIME;
/**
* 自定义校验注解
* @author lst
* @date 2020-7-16 17:56
*/
@Documented
@Constraint(validatedBy = { ListValueConstraintValidator.class}) //校验的逻辑处理类,可以是多个
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface ListValue {
String message() default "{com.atguigu.common.valid.ListValue.message}";//提示的信息,我是配置在默认的配置文件中ValidationMessages.properties
Class<?>[] groups() default { }; //分组验证,例如只在新增时进行校验等
Class<? extends Payload>[] payload() default { };
int[] vals() default { }; //可以允许的值
}
元注解 | @interface上面按需要注解上一些东西 | 包括@Retention、@Target、@Document、@Inherited四种。 |
注解的保留策略 | @Retention(xxx.SOURCE) | 注解仅存在于源码中,在class字节码文件中不包含 |
@Retention(xxx.CLASS) | 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得 | |
@Retention(xxx.RUNTIME) | 注解会在class字节码文件中存在,在运行时可以通过反射获取到 | |
注解的作用目标 |
@Target(ElementType.TYPE) | 接口、类、枚举、注解 |
@Target(ElementType.FIELD) | 字段、枚举的常量 | |
@Target(ElementType.METHOD) | 方法 | |
@Target(ElementType.PARAMETER) | 方法参数 | |
@Target(ElementType.CONSTRUCTOR) | 构造函数 | |
@Target(ElementType.LOCAL_VARIABLE) | 局部变量 | |
@Target(ElementType.ANNOTATION_TYPE) | 注解 | |
@Target(ElementType.PACKAGE) | 包 |
3、配置ValidationMessages.properties文件
此文件是处理String message() default "{com.atguigu.common.valid.ListValue.message}";的提示信息,在项目的resources下新建ValidationMessages.properties文件,填写以下内容。
com.atguigu.common.valid.ListValue.message=必须提交指定的值
4、处理校验逻辑
package com.atguigu.common.valid;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;
/**
* @DESCRIPTION
* @Author lst
* @Date 2020
*/
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {
private Set<Integer> set = new HashSet<>();
//初始化方法
@Override
public void initialize(ListValue constraintAnnotation) {
int[] vals = constraintAnnotation.vals();
for (int val : vals) {
set.add(val);
}
}
/**
*判断是否校验成功
* @param value 需要校验的值
* @param context
* @return
*/
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
return set.contains(value);
}
}
5、使用自定义注解
package com.atguigu.gulimall.product.entity;
import com.atguigu.common.valid.AddGroup;
import com.atguigu.common.valid.ListValue;
import com.atguigu.common.valid.UpdateGroup;
import com.atguigu.common.valid.UpdateStatusGroup;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.hibernate.validator.constraints.URL;
import javax.validation.constraints.*;
import java.io.Serializable;
/**
*
* @author lst
* @email lst@gmail.com
* @date 2020-06-22 15:24:53
*/
@Data
public class BrandEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 介绍
*/
private String descript;
/**
* 显示状态[0-不显示;1-显示]
*/
@ListValue(vals = {0,1})
private Integer showStatus;
}
在controller使用
package com.atguigu.gulimall.product.controller;
import com.atguigu.common.utils.PageUtils;
import com.atguigu.common.utils.R;
import com.atguigu.common.valid.AddGroup;
import com.atguigu.common.valid.UpdateGroup;
import com.atguigu.common.valid.UpdateStatusGroup;
import com.atguigu.gulimall.product.entity.BrandEntity;
import com.atguigu.gulimall.product.service.BrandService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.Map;
//import org.apache.shiro.authz.annotation.RequiresPermissions;
/**
*
* @author lst
* @email lst@gmail.com
* @date 2020-06-22 15:24:53
*/
@RestController
@RequestMapping("product/brand")
public class BrandController {
@Autowired
private BrandService brandService;
@RequestMapping("/save")
public R save(@Validated @RequestBody BrandEntity brand){
brandService.save(brand);
return R.ok();
}
}
6、测试