Почему мой ResponseEntityExceptionHandler никогда не вызывается? - PullRequest
0 голосов
/ 23 мая 2018

У меня есть простое @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.
    }

}

1 Ответ

0 голосов
/ 23 мая 2018

ResponseEntityExceptionHandler является концепцией Spring MVC и применяется только к Spring Controllers.Судя по всему, ваше приложение использует Джерси.Это не будет применяться здесь.Для этого вам нужно использовать соответствующую инфраструктуру в Джерси.

...