具有预定义验证的自定义约束验证

时间:2019-11-26 13:26:58

标签: java rest validation

我正在制作REST API,在处理请求之前,需要对请求进行一些验证。

这是我希望作为输入的对象之一:

@ValidRequest
public class SampleInput {

    @Valid
    @NotNull(message = "enumValue can't be null")
    private EnumValue enumValue;
    private Object someOtherField;
    // Rest of the fields/setters/getters ommited
}

这是自定义验证界面

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = RequestValidator.class)
@Documented
public @interface ValidRequest {

    String message() default "Error validating request";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}

和实施

public class RequestValidator implements ConstraintValidator<ValidRequest, SampleInput> {

    @Override
    public void initialize(ValidRequest constraintAnnotation) {
       // Ommited
    }

    @Override
    public boolean isValid(SampleInput request, ConstraintValidatorContext context) {
        context.disableDefaultConstraintViolation();
        switch (request.getEnumValue()) {
           // NPE thrown here ^
        }
        // Ommited
    }
}

我的API端点正在验证请求,如下所示:

@POST
@Path("/request")
public Response doRequest(@Valid SampleInput input) {
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();
    Set<ConstraintViolation<SampleInput>> validationConstraints = validator.validate(request);
    if (!validationConstraints.isEmpty()) {
         // Reject the request with an error message specific to the ConstraintViolations encountered
    }
    // Method ommited
}

当我测试该实现时,我注意到未应用任何预定义的批注,例如@NotNull@Size,而当我尝试访问enumValue时,我得到了NullPointerException。这只是一个示例请求,我的实际请求包含许多带有不同注释的字段。我对此有两个问题。

  1. 定义自定义验证程序时是否执行预定义的验证?
  2. 如果对#1的回答为“是”,它们将按什么顺序执行?如果对#2的回答是否定的,有什么办法可以添加它而不必在我的自定义验证器中实际重写那些验证?

0 个答案:

没有答案