我有这样的Jersey Rest API:
@POST
@Path("/doorder")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces("text/plain")
public String doOrder(@BeanParam final @Valid OrderBean order) {
// Some implementation here
}
我所有的输入都存储在这个bean中:
@AddressAtLeastOne
public final class OrderBean {
@FormDataParam("address")
private String address;
@FormDataParam("city")
private String city;
@FormDataParam("postcode")
private String postcode;
// Other member variables
// Getters and setters
}
我添加了一个注释来验证地址(@AddressAtLeastOne)。如果3个字段中至少有一个具有值,则该地址有效。
这是注释定义:
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RUNTIME)
@Constraint(validatedBy = AddressAtLeastOneValidator.class)
@Documented
public @interface AddressAtLeastOne {
String message() default "Address requires at least one field";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
这是验证器:
public class AddressAtLeastOneValidator implements ConstraintValidator<AddressAllOrNone, OrderBean> {
@Override
public boolean isValid(OrderBean demoBean, ConstraintValidatorContext constraintValidatorContext) {
// Check for at least one value
if((demoBean.getAddress() != null && !demoBean.getAddress().equals("") ||
(demoBean.getCity() != null && !demoBean.getCity().equals("")) ||
(demoBean.getPostcode() != null && !demoBean.getPostcode().equals("")))) {
return true;
}
return false;
}
}
一切都很好!但是现在我想将注释@AddressAtLeastOne重命名为@AtLeastOne并使其成为通用的,以便我可以将它应用于任何类。我需要一种机制,我可以指定哪些成员变量是我要用@AtLeastOne验证的组的一部分。我怎么能这样做?
答案 0 :(得分:1)
这样做的一种方法是使用Reflection
-
annotation
,假设@GroupNotNullField
并将此annotation
应用于bean class
中至少有一个字段应具有值的所有字段。通过这种方式,您可以跳过一些不需要验证的字段。 validator class
中,使用bean class
Reflection
的所有字段
@GroupNotNullField annotation
true
或false
。