Spring Boot 利用Validation实现参数校验

本文记录了在Java中创建自定义注解及校验逻辑的过程,用于微信入参的特定值校验。首先定义了一个名为`WechatScope`的注解,然后实现了`ConstraintValidator`接口以完成校验逻辑。在使用时,注解需加在控制器参数上,并配合`@Validated`注解使校验生效,错误信息可通过统一异常处理优雅返回。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录帖,这部分网上资料较多,但实现过程中还是有些小坑,记录下,便于之后阅读

步骤
  1. 创建一个Annotation
  2. 创建校验逻辑类,并实现ConstraintValidator<A, T>
  3. 使用(注意事项)

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. 使用(注意事项)
  1. 在字段或者参数上调用
  2. 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 {

可以结合统一异常处理,优雅的返回信息

以后若其他地方有用到级联、分组等高级特性再补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值