You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何校验@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 13:09:03