java - 如何记录 SpringBoot 请求验证错误?
问题描述
如何在springboot中记录请求验证错误?比如说,我们有一个如下所示的 API,如果其中一个请求参数中存在验证错误,我需要记录吗?
@GetMapping(value = "/hello", produces = MediaType.APPLICATION_JSON_VALUE)
public String sayHi(@RequestParam(name = "size") @Max(30) Integer size) {
return "Hi" + size.toString();
}
如果大小值大于 30,则 API 返回验证错误。但是,除此之外,我还在寻找一种记录此类无效请求的方法
解决方案
由于您使用的是 springboot,您可以使用 spring boot 集中异常处理@ControllerAdvice
来记录这些错误或返回自定义的公共响应类。注释将@ControllerAdvice
使其全局应用于所有控制器。为了捕获请求主体的验证错误,我们将处理MethodArgumentNotValidExceptions
如下:
@ControllerAdvice
class ErrorHandlingControllerAdvice {
private static final Logger LOGGER = LoggerFactory.getLogger(ErrorHandlingControllerAdvice.class);
@ExceptionHandler(ConstraintViolationException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
ApiErrorResponse onConstraintValidationException(
ConstraintViolationException e) {
ApiErrorResponse apiErrorResponse = new ApiErrorResponse();
for (ConstraintViolation violation : e.getConstraintViolations()) {
apiErrorResponse.getViolations().add(
new Violation(violation.getPropertyPath().toString(), violation.getMessage()));
}
return apiErrorResponse;
}
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
ApiErrorResponse onMethodArgumentNotValidException(
MethodArgumentNotValidException e) {
ApiErrorResponse error = new ApiErrorResponse();
for (FieldError fieldError : e.getBindingResult().getFieldErrors()) {
error.getViolations().add(
new Violation(fieldError.getField(), fieldError.getDefaultMessage()));
}
LOGGER.error("Log whatever you want to here");
return error;
}
}
推荐阅读
- android - LiveData.value 返回 Null 但 Livedata 直接观察它得到结果
- r - 如何在R中的数据帧的一行中找到两个最高值和两个最低值
- graphics - android 12 移植:Surfaceflinger 死锁
- reactjs - 如何在自定义插件中实现共享十字准线 - Grafana
- pandas - 概率变异数据框
- php - 在 Laravel 中检索列值数组的更好方法?
- php - PHP:在类中调用具有返回值的函数
- python - 在 spacy 训练数据中基于 NER 实体标签过滤数据
- c++ - 如何获取有关代码包含的文件、类和函数的信息?
- gitlab - 如何在 GitLab 中列出/删除所有空存储库。?