记录帖,这部分网上资料较多,但实现过程中还是有些小坑,记录下,便于之后阅读
步骤
- 创建一个Annotation
- 创建校验逻辑类,并实现ConstraintValidator<A, T>
- 使用(注意事项)
1. 创建一个Annotation
package cn.****.****.utils.annotation;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
/**
* @description: 自定义注解校验微信的入参
* @author: liaobingxiang
* @date: 2021/9/29 1:46
*/
// 注解生效域 source class runtime
@Retention(RetentionPolicy.RUNTIME)
// 注解使用地方
@Target({ElementType.PARAMETER, ElementType.FIELD})
@Documented
// 校验逻辑类
@Constraint(validatedBy = {WechatScopeValidator.class})
public @interface WechatScope {
//====== 自定义参数,可在调用时,传递参数: @WechatScope(required = false)
/**
* 是否强制校验
* @return 默认为true:进行强制校验
*/
boolean required() default true;
//====== 必须包含的,JSR规范,否则校验时会报错
/**
* 报错信息
* @return 校验不通过时的报错信息
*/
String message() default "参数必须为snsapi_base或snsapi_userinfo";
/**
* 将validator进行分类,不同的类group中会执行不同的validator操作
*
* @return validator的分类类型
*/
Class<?>[] groups() default {};
/**
* 主要是针对bean,很少使用
*
* @return 负载
*/
Class<? extends Payload>[] payload() default {};
}
2. 创建校验逻辑类,并实现ConstraintValidator<A, T>
package cn.****.****.utils.annotation;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
* @description:
* @author: liaobingxiang
* @date: 2021/9/29 1:50
*/
public class WechatScopeValidator implements ConstraintValidator<WechatScope, String> {
/**
* 是否强制校验
*/
private boolean required;
// 可以通过constraintAnnotation 获取注解中自定义的值
@Override
public void initialize(WechatScope constraintAnnotation) {
this.required = constraintAnnotation.required();
}
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
if (required) {
return "snsapi_base".equals(s) || "snsapi_userinfo".equals(s);
}
return true;
}
}
3. 使用(注意事项)
- 在字段或者参数上调用
- Controller加上注解
// !!!不加上,则注解不会生效
@Validated
@RestController
public class OauthController {
/**
* @param scope 只能是 snsapi_base 或 snsapi_userinfo
*/
@GetMapping("/login")
public void loginUser(@RequestParam("scope") @WechatScope String scope, HttpServletResponse response) throws IOException {
可以结合统一异常处理,优雅的返回信息
以后若其他地方有用到级联、分组等高级特性再补充