为什么我的ResponseEntityExceptionHandler永远不会被调用?

时间:2018-05-23 11:12:18

标签: validation spring-boot spring-4

我有一个简单的@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 :(得分:1)

ResponseEntityExceptionHandler是一个Spring MVC概念,仅适用于Spring Controllers。从它的外观来看,你的应用程序正在使用Jersey。这不适用于此。您需要在泽西岛使用适当的基础设施。

相关问题