@RequestHeader 请求头参数为空ServletRequestBindingException异常处理

获取请求头方式

  1. 使用注解 @RequestHeader
@PostMapping(value = "/test/header")
public void post(@RequestHeader(value="sign") String sign) {
    // ...
}
  1. 从 HTTPServletRequest 中获取
@PostMapping(value = "/test/header")
public void post(HttpServletRequest request) {
    String sign = request.getHeader("sign")
    // ...
}

还原场景

请求头参数为空异常出现的场景:由上面第一种方式通过注解 @RequestHeader 获取请求头 sign 参数时,默认请求头参数时必传的,如果不传的话,接口在获取参数时就会抛出 ServletRequestBindingException 异常:

org.springframework.web.bind.ServletRequestBindingException: Missing request header 'Sign' for method parameter of type String

解决方案

  1. 设置为非必传,在代码中进行必输校验

    @RequestHeader 注解有一个 require 属性,默认为 true,其含义为参数必传。这里将它设置为 false,如果请求头参数没有设置,sign 则为 null。

@PostMapping(value = "/test/header")
public void post(@RequestHeader(value="sign", required = false) String sign) {
    if(sign == null) {
        // return 请求头参数必须传递...
    }
    
    // ...
}
  1. 全局异常处理拦截 ServletRequestBindingException 异常
@ExceptionHandler(value = ServletRequestBindingException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public Result handleServletRequestBindingException(ServletRequestBindingException e) {
    return Result.of("test", "请求头必须传递");
}

第二种方式虽然可以拦截到请求头缺失导致的异常,也可能拦截其他情况产生的该异常,范围比较宽泛,如果需要针对某一个请求头来处理非空校验的话,可以使用第一种方式。

参考:https://stackoverflow.com/questions/25151264/intercept-requestheader-exception-for-missing-header

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐