Validation 为什么我的ResponseEntityExceptionHandler从未被调用?

Validation 为什么我的ResponseEntityExceptionHandler从未被调用?,validation,spring-boot,spring-4,Validation,Spring Boot,Spring 4,我有一个简单的@RestController。我的最终目标是能够验证传入的@QueryParam字符串id是否是UUID。这部分工作正常,但由isvaliduidvalidator引发的异常从来不会通过我的自定义ResponseEntityExceptionHandler处理。我需要它来控制错误的输出 我已经阅读并试用了一系列教程和博客,但无论我做什么,验证异常都不会进入GlobalExceptionHandler\handleMethodArgumentNotValid 为什么验证异常从未在我

我有一个简单的
@RestController
。我的最终目标是能够验证传入的
@QueryParam字符串id
是否是
UUID
。这部分工作正常,但由
isvaliduidvalidator引发的异常从来不会通过我的自定义
ResponseEntityExceptionHandler
处理。我需要它来控制错误的输出

我已经阅读并试用了一系列教程和博客,但无论我做什么,验证异常都不会进入
GlobalExceptionHandler\handleMethodArgumentNotValid

为什么验证异常从未在我的自定义
ResponseEntityExceptionHandler
中通过
handleMethodArgumentValid
运行

注意!我确实看到Spring从该类的默认构造函数中的一个简单日志事件中获取GlobalExceptionHandler

搜索资源

@RestController
@Path("/search")
public class SearchResource extends AbstractResource {

    @GET
    @Path("/suggestions")
    @Produces(MediaType.APPLICATION_XML)
    public Response getSuggestions(@IsValidUUID @QueryParam("territoryId") String territoryId) {
isvaliduid

@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 {};

}
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.PARAMETER})
@保留(RetentionPolicy.RUNTIME)
@记录
@约束(validatedBy={IsValidUUIDValidator.class})
public@interface isvaliduid{
字符串消息()默认为“无效UUID”;
类[]组()默认值{};

ResponseEntityExceptionHandler
是一个Spring MVC概念,仅适用于Spring控制器。从外观上看,您的应用程序正在使用Jersey。这不适用于此处。您需要在Jersey中使用相应的基础结构。

尝试添加
@ExceptionHandler(MethodArgumentNotValidException.Class)
下面的
GlobalExceptionHandler
中的
覆盖
如果无效,可以尝试将
handleMethodArgumentNotValid
受保护
更改为
公共
@rdj7尝试从
受保护
更改为
公共
,但没有成功。添加
@ExceptionHandler
使Spr生效ing投诉
MethodArgumentNotValidException
的两个异常处理程序,因为
ResponseEntityExceptionHandler
handleException
中已经有了此异常的
@ExceptionHandler
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;
        }

    }

}
@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.
    }

}