【发布时间】:2017-03-14 05:06:02
【问题描述】:
这里有点贪心的问题,希望这个问题也可以帮助其他想了解更多注释验证的人
我目前正在学习 Spring,目前我正计划尝试自定义带注释的验证。
查了很多,现在知道验证主要有两种,一种是用于控制器的,另一种是使用@Valid的注解方法
所以这是我的场景: 假设我有两个或多个字段,当它们都为 NULL 时它们可以为空。 但只有当这些字段之一包含除空字符串之外的任何值时,这些字段才需要输入。我有两个想法,但不知道如何正确实施。
这是类示例:
public class Subscriber {
private String name;
private String email;
private Integer age;
private String phone;
private Gender gender;
private Date birthday;
private Date confirmBirthday;
private String birthdayMessage;
private Boolean receiveNewsletter;
//Getter and Setter
}
假设我希望生日和 ConfirmBirthday 字段都需要为 null 或相反,我可能想为它们每个使用一个注释来注释它们,如下所示:
public class Subscriber {
private String name;
private String email;
private Integer age;
private String phone;
private Gender gender;
@NotNullIf(fieldName="confirmBirthday")
private Date birthday;
@NotNullIf(fieldName="birthday")
private Date confirmBirthday;
private String birthdayMessage;
private Boolean receiveNewsletter;
//Getter and Setter
}
所以我确实需要像这样创建验证注释:
@Documented
@Constraint(validatedBy = NotNullIfConstraintValidator.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.FIELD })
public @interface NotNullIf {
String fieldName();
String message() default "{NotNullIf.message}";
Class<?>[] group() default {};
Class<? extends Payload>[] payload() default {};
}
然后我需要自己创建验证器:
public class NotNullIfConstraintValidator implements ConstraintValidator<NotNullIf, String>{
private String fieldName;
public void initialize(NotNullIf constraintAnnotation) {
fieldName = constraintAnnotation.fieldName();
}
public boolean isValid(String value, ConstraintValidatorContext context) {
if(value == null) {
return true;
};
//TODO Validation
return false;
}
}
那么如何实现呢?
另一个想法使用相同的类作为一个例子,说我想要生日,confirmBirthday 和birthdayMessdage 只能为空或同时反对。 这次我可能需要使用类注释验证来进行跨字段验证。
这是我想注释类的方式:
@NotNullIf(fieldName={"birthday", "confirmBirthday", "birthdayMessage"})
public class Subscriber {
//Those field same as the above one
}
所以当其中一个字段不为空时,其余字段也需要在客户端大小上输入。 有可能吗?
我看过这篇文章:How to access a field which is described in annotation property
但我仍然对上面列出的这些元素的注释验证如何工作感到困惑。 也许我需要对该代码进行一些详细的解释,或者更糟的是我可能需要一些基本的概念检查。
请帮忙!
【问题讨论】:
标签: java spring validation spring-mvc annotations