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