前言
接上一篇文章https://blog.youkuaiyun.com/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;
}
以上就是本篇文章所有内容,有任何疑问或建议,请在留言区留言,抱拳。