@RequestHeader 请求头参数为空异常处理
@RequestHeader 请求头参数为空ServletRequestBindingException异常处理获取请求头方式使用注解 @RequestHeader@PostMapping(value = "/test/header")public void post(@RequestHeader(value="sign") String sign) {// ...}从 HTTPServletRe
@RequestHeader 请求头参数为空ServletRequestBindingException异常处理
获取请求头方式
- 使用注解 @RequestHeader
@PostMapping(value = "/test/header")
public void post(@RequestHeader(value="sign") String sign) {
// ...
}
- 从 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
解决方案
-
设置为非必传,在代码中进行必输校验
@RequestHeader 注解有一个 require 属性,默认为 true,其含义为参数必传。这里将它设置为 false,如果请求头参数没有设置,sign 则为 null。
@PostMapping(value = "/test/header")
public void post(@RequestHeader(value="sign", required = false) String sign) {
if(sign == null) {
// return 请求头参数必须传递...
}
// ...
}
- 全局异常处理拦截 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
更多推荐
所有评论(0)