我正在制作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。这只是一个示例请求,我的实际请求包含许多带有不同注释的字段。我对此有两个问题。