我有一个简单的@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.
}
}
答案 0 :(得分:1)
ResponseEntityExceptionHandler
是一个Spring MVC概念,仅适用于Spring Controllers。从它的外观来看,你的应用程序正在使用Jersey。这不适用于此。您需要在泽西岛使用适当的基础设施。