自定义参数校验注解

前言

接上一篇文章https://blog.csdn.net/FU250/article/details/80247930,今天继续实现自定义参数注解。

添加自定义注解PasswordNotNull

@Target(ElementType.FIELD)//作用于的类型,此处为对象的属性
@Retention(RetentionPolicy.RUNTIME)//运行时生效
@Constraint(validatedBy = PasswordNotNullValidator.class)//通过PasswordNotNullValidator类实现注解的相关校验操作
public @interface PasswordNotNull {
    String message() default "";//必填,校验未通过时的提示信息
    Class<?>[] groups() default {};//必填,下文会将到此参数的作用
    Class<? extends Payload>[] payload() default {};//必填
}

添加PasswordNotNullValidator实现注解的相关校验操作,实现该类ConstraintValidator<A,T>时,A为注解类,T为注解作用的参数类型,以下为Object类型。该类中可直接引用注入spring容器中的对象,例如service等。

public class PasswordNotNullValidator implements ConstraintValidator<PasswordNotNull,Object>{

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void initialize(PasswordNotNull passwordNotNull) {
        logger.info("初始化passwordNotNull注解");
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        return false;//返回false代表校验失败,true代表校验通过
    }
}

将之前的NotBlank替换为PasswordNotNull,提交测试用例时发现,返回相关提示信息,代表自定义的注解已经生效了。

//    @NotBlank(message = "密码不能为空!")
    @PasswordNotNull(message = "不能为空啊密码!")
    private String password;
groups的作用及用法

由于实际开发中,添加操作和更新操作需要限制的参数可能不一致,所以参数校验需要对添加和更新操作进行区分,设置groups就能优雅的帮我们解决这个问题,这里就用不适用添加和更新场景直接说用法,我相信大家看到用法后,自然就会用了。

public class Animal {
    public interface SimpleView{}//创建一个空的接口
    @PasswordNotNull(message = "不能为空啊密码!",groups = {SimpleView.class})
    private String password;
}

设置完groups后,方法参数上的Valid需要进行修改如下才会生效,就是将Valid替换为Validated并设置分组信息即可。

public Map<String,Object> createAnimal(@Validated({Animal.SimpleView.class}) @RequestBody Animal animal,
                                           BindingResult bindingResult){
        logger.info(animal.toString());
        Map<String,Object> result = new HashMap<>();
        if (bindingResult.hasErrors()){
            FieldError error = (FieldError) bindingResult.getAllErrors().get(0);
            result.put("code","400");
            result.put("message",error.getDefaultMessage());
            return result;
        }
        result.put("code","200");
        result.put("data",animal);
        return result;
    }
以上就是本篇文章所有内容,有任何疑问或建议,请在留言区留言,抱拳。

猜你喜欢

转载自blog.csdn.net/fu250/article/details/80290218