如何校验@RequestHeader标注的UUID类型请求头非空并抛出可被@ExceptionHandler处理的异常
解决方案
你遇到的是@RequestHeader的required=true仅校验请求头是否存在、不校验值是否为空的问题,可通过Spring Validation框架实现校验,步骤如下:
第一步:引入校验依赖
Spring Boot项目直接引入校验启动器即可:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
第二步:开启Controller校验能力
给对应的Controller类添加@Validated注解,开启方法参数校验功能:
import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RestController; @Validated @RestController public class YourController { // 接口定义 }
第三步:给请求头参数添加校验注解
给UUID类型的请求头参数添加@NotNull注解,自定义错误提示信息:
@GetMapping("/your/api") public void yourApi( @RequestHeader(value = "My-Header") @NotNull(message = "My-Header请求头不能为空") final UUID myHeader ) { // 业务逻辑 }
第四步:编写全局异常处理器捕获校验异常
校验失败会抛出ConstraintViolationException,直接在@ExceptionHandler中捕获处理即可,同时你也可以额外捕获另外两种常见的请求头异常,区分不同错误场景:
import org.springframework.web.bind.MissingRequestHeaderException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import java.util.stream.Collectors; @RestControllerAdvice public class GlobalExceptionHandler { // 处理请求头值为空的校验异常 @ExceptionHandler(ConstraintViolationException.class) public ErrorResponse handleEmptyHeader(ConstraintViolationException e) { String msg = e.getConstraintViolations().stream() .map(ConstraintViolation::getMessage) .collect(Collectors.joining(",")); return new ErrorResponse(400, msg); } // 处理请求头完全缺失的异常 @ExceptionHandler(MissingRequestHeaderException.class) public ErrorResponse handleMissingHeader(MissingRequestHeaderException e) { return new ErrorResponse(400, "My-Header请求头不能为空"); } // 处理UUID格式错误的异常 @ExceptionHandler(MethodArgumentTypeMismatchException.class) public ErrorResponse handleInvalidUuid(MethodArgumentTypeMismatchException e) { return new ErrorResponse(400, "My-Header请求头格式非法"); } }
效果验证
当你使用curl --header 'My-Header;' http://your-domain/your/api请求时,会触发@NotNull校验,抛出ConstraintViolationException被全局异常处理器捕获,返回自定义的错误提示。
内容的提问来源于stack exchange,提问作者Andrei Kulik
相关产品推荐
相关产品推荐

