不说废话,直接上操作。
1、加入依赖
<!-- 校验依赖 -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
2、编写自定义校验注解
package com.black.valid;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 自定义性别校验注解
*
* @author black
* @since 2024年1月17日10:01:39
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = SexValidator.class)
public @interface SexValid {
String fieldName();
String message() default "字段超出取值范围";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Target注解定义作用范围,可选为类、方法、字段,可以单选也可以多选。
Retention注解定义生效范围,这里选取的是运行时。
Constraint注解定义的是自定义校验类。
fieldName是我自己定义的参数,用法后面会提及,可以定义也可以不定义。
message是校验框架自带的参数,default是默认值,可覆盖,后面会提及。
下面两个框架必须,不可缺。
3、编写自定义校验类
package com.black.valid;
import com.black.common.SexEnum;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Objects;
/**
* 自定义性别校验类
*
* @author black
* @since 2024年1月17日10:05:10
*/
public class SexValidator implements ConstraintValidator<SexValid, String> {
private String fieldName;
@Override
public void initialize(SexValid sexValid) {
fieldName = sexValid.fieldName();
}
@Override
public boolean isValid(String sex, ConstraintValidatorContext constraintValidatorContext) {
Integer key = SexEnum.getKey(sex);
if (Objects.isNull(key)) {
constraintValidatorContext.buildConstraintViolationWithTemplate(fieldName + "必须为男性或者女性...").addConstraintViolation();
return false;
} else {
return true;
}
}
}
自定义校验类需要继承ConstraintValidator接口,接口泛型第一个参数是注解类,第二个参数是校验的目标字段的类型。
fieldName是我自定义的变量,目的是获取自定义注解中的fieldName属性值。
initialize()方法是初始化方法,即在初始化之前需要做哪些事情。
isVaild()方法是校验方法,返回值为boolean,如果为true则校验通过,如果为false则校验不通过,并且返回提示信息,即自定义注解中的message属性,该属性可以被覆盖,覆盖方法即调用上下文环境通过构造模板设置参数,我的做法就是这样的。
3、使用自定义校验
使用自定义校验分两部分,第一部分是在需要校验的参数上加我们写好的自定义注解。
package com.black.entity;
import com.black.valid.SexValid;
import lombok.Data;
/**
* 用户信息实体
*
* @author black
* @since 2024年1月17日09:33:03
*/
@Data
public class UserInfoEntity {
private Long id;
private String username;
private String password;
private Integer age;
@SexValid(fieldName = "性别")
private String sex;
}
第二部分是在启动校验的地方加@Valid注解
package com.black.controller;
import com.black.entity.UserInfoEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
/**
* 测试controller
*
* @author black
* @since 2024年1月17日10:24:33
*/
@RestController
public class UserInfoController {
@PostMapping("/test")
public String test02(@Valid @RequestBody(required = false) UserInfoEntity user) {
return user.getSex() + ",hello world!";
}
}