当@Valid body 不满足并且@ExceptionHandler 命中时得到 headers
get headers when @Valid body not satisfy and @ExceptionHandler hits
我是 springboot 的新手,正在处理遗留项目。我搜索过但没有找到答案。
当前工作项目使用 @Valid @RequestBody
验证 body,并使用 @ExceptionHandler
捕获异常。
现在新的要求是处理请求headers,不管body是否有效,我都会使用headers(例如记录)。
问题是我不知道如何在 @ExceptionHandler
命中时获得 headers。类似的问题是 但我无法弄清楚如何从注入的 RequestContext
中获取 headers (我什至无法在答案中解析 getRequestBody()
方法)。
最小的、工作的和可重现的代码被推送到 github。
- 模特:
public class Book {
@NotBlank(message = "Title is mandatory")
public String Title;
}
- 控制者
@RestController
public class BooksController {
final Log log = LogFactory.getLog(getClass());
@PostMapping("/")
public String add(@RequestHeader("id") String value, @Valid @RequestBody final Book book) {
log.info(value); // want this value even when hit @ExceptionHandler
return "added " + book.Title;
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public String handleInvalidRequest(final MethodArgumentNotValidException e) {
//log headers; ??
return e.getMessage();
}
}
- 客户
curl -H "id:123" -H "Content-Type: application/json" http://localhost:8080 --data '{"Title":""}'
- 附加信息
jdk11、springboot 2.5.3、intellij idea 2021.
模型的代码在我无法更改的库中,因此我不知道验证逻辑。
我想应该有很多方法可以解决,比如定义一些自定义的中间件或句柄,但我对这些不熟悉,我想看到一个代码更改最少的解决方案。谢谢!
在@ExceptionalHandler
里面你可以接受HttpServletRequest
得到headers
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public String handleInvalidRequest(final MethodArgumentNotValidException e, final HttpServletRequest req) {
//log headers; ??
req.getHeader("My-Header");
return e.getMessage();
}
我是 springboot 的新手,正在处理遗留项目。我搜索过但没有找到答案。
当前工作项目使用 @Valid @RequestBody
验证 body,并使用 @ExceptionHandler
捕获异常。
现在新的要求是处理请求headers,不管body是否有效,我都会使用headers(例如记录)。
问题是我不知道如何在 @ExceptionHandler
命中时获得 headers。类似的问题是 RequestContext
中获取 headers (我什至无法在答案中解析 getRequestBody()
方法)。
最小的、工作的和可重现的代码被推送到 github。
- 模特:
public class Book {
@NotBlank(message = "Title is mandatory")
public String Title;
}
- 控制者
@RestController
public class BooksController {
final Log log = LogFactory.getLog(getClass());
@PostMapping("/")
public String add(@RequestHeader("id") String value, @Valid @RequestBody final Book book) {
log.info(value); // want this value even when hit @ExceptionHandler
return "added " + book.Title;
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public String handleInvalidRequest(final MethodArgumentNotValidException e) {
//log headers; ??
return e.getMessage();
}
}
- 客户
curl -H "id:123" -H "Content-Type: application/json" http://localhost:8080 --data '{"Title":""}'
- 附加信息
jdk11、springboot 2.5.3、intellij idea 2021.
模型的代码在我无法更改的库中,因此我不知道验证逻辑。
我想应该有很多方法可以解决,比如定义一些自定义的中间件或句柄,但我对这些不熟悉,我想看到一个代码更改最少的解决方案。谢谢!
在@ExceptionalHandler
里面你可以接受HttpServletRequest
得到headers
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public String handleInvalidRequest(final MethodArgumentNotValidException e, final HttpServletRequest req) {
//log headers; ??
req.getHeader("My-Header");
return e.getMessage();
}