使Jersey bean验证注释通用

时间:2017-03-10 17:56:46

标签: java rest validation jersey

我有这样的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验证的组的一部分。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

这样做的一种方法是使用Reflection -

  1. 创建自定义annotation,假设@GroupNotNullField并将此annotation应用于bean class中至少有一个字段应具有值的所有字段。通过这种方式,您可以跳过一些不需要验证的字段。
  2. validator class中,使用bean class
  3. 获取Reflection的所有字段
  4. 选中所有使用@GroupNotNullField annotation
  5. 注释的字段
  6. 获取所有此类字段的值,并检查至少有一个字段的值。
  7. 根据验证检查,返回truefalse