自定义参数验证器

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-29 00:00   11   0

代码中经常会对请求参数是否为空,是否为手机号码,是否为邮件格式,是否为数字等类型判断,对这类处理可以写一个自定义参数验证类即可。

第一步:加入依赖包

<!--validation校验 -->
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

第二步:定义一个注解

/**
 * 非空验证
 * 
 * @author wumq
 *
 */
@Constraint(validatedBy = RequireAnnoValidator.class)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface RequireAnno {
    /**
     * 错误信息
     * 
     * @return
     */
    String message() default "请求参数不能为空";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

其中@Constraint(validatedBy = RequireAnnoValidator.class),指定注解解析类。

这里有个注意点,注解类中必须包含下面几行代码:

Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};

如果不加上,会报下面错误信息:

javax.validation.ConstraintDefinitionException: HV000074: com.××××××.validate.annotation.RequireAnno contains Constraint annotation, but does not contain a groups parameter.

第三步:定义注解解析验证类

public class RequireAnnoValidator implements ConstraintValidator<RequireAnno, Object> {

    @Override
    public void initialize(RequireAnno constraintAnnotation) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        if (value == null) {
            return false;
        }

        if (value instanceof String && StringUtils.isBlank(value.toString())) {
            return false;
        }

        return true;
    }

}

第四步:如何使用

@Validated
@Controller
@RequestMapping("/moduledemo/monitor")
public class MonitorController extends BaseController {
    @RequestMapping(value = "/test", method = RequestMethod.POST)
    @ResponseBody
    public MonitorModel test(@RequestBody @Valid MonitorPo po) throws Exception {
        MonitorModel model = new MonitorModel();
        // throw new NullPointerException("test");
        return model;
    }
}

在Controller类上加上@Validated注解,同时在请求参数前面加上@Valid注解。否则就会出现注解无效。

百度上很多例子,都只是在参数前加上@Valid注解,但在Controller类上没加@Validated注解,实测注解无效,这个大家务必注意一下。

实际使用中还存在另外一个问题,如果参数对象中嵌套对象,这个对象中也要参数验证的话,那么就要在这个类的属性上,也要加@Valid注解,这点用起来不是很爽。当然也可以完全抛弃框架自带的验证器,完全自定义一个,然后自己做一个AOP切面拦截,去拦截@RequestBody注解的参数即可,包含嵌套参数都可以实现,这样就无需到处加@Validated和@Valid注解了。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP