У меня есть простое @RestController
.Моя конечная цель - иметь возможность проверить, является ли входящий @QueryParam String id
UUID
.Эта часть работает, но исключение, выдаваемое IsValidUUIDValidator
, никогда не проходит через мой пользовательский ResponseEntityExceptionHandler
.Мне нужно это, чтобы иметь возможность контролировать вывод ошибок.
Я прочитал и опробовал ряд учебных пособий и блогов, но независимо от того, что я делаю, исключения проверки никогда не вводят GlobalExceptionHandler#handleMethodArgumentNotValid
.
Почему исключения проверки никогда не проходят через handleMethodArgumentValid
в моем пользовательском ResponseEntityExceptionHandler
?
Примечание!Я вижу, что Spring выбирает GlobalExceptionHandler из простого события журнала в конструкторе по умолчанию этого класса.
SearchResource
@RestController
@Path("/search")
public class SearchResource extends AbstractResource {
@GET
@Path("/suggestions")
@Produces(MediaType.APPLICATION_XML)
public Response getSuggestions(@IsValidUUID @QueryParam("territoryId") String territoryId) {
IsValidUUID
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {IsValidUUIDValidator.class})
public @interface IsValidUUID {
String message() default "Invalid UUID";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
isValidUUIDValidator
public class IsValidUUIDValidator implements ConstraintValidator<IsValidUUID, String> {
@Override
public void initialize(IsValidUUID constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return false;
}
try {
UUID.fromString(value);
return true;
} catch (Exception e) {
System.out.println("Invalid!");
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate("The provided UUID is not valid")
.addConstraintViolation();
return false;
}
}
}
GlobalExceptionHandler
@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
System.out.println("This method never gets invoked");
return super.handleMethodArgumentNotValid(ex, headers, status, request); //To change body of generated methods, choose Tools | Templates.
}
}