spring - 为 Spring Rest 控制器添加全局错误处理
问题描述
我有很多这样的控制器
@RestController
@RequestMapping("/contracts")
public class ContractsController {
@Autowired
ContractsService service;
@PostMapping("/selectAll")
public WebMessageModel selectAll(@RequestBody ContractFiltersInputModel inputModel) {
return new WebMessageModel(true, service.selectAll(inputModel));
}
}
我还有另一个控制器
@Controller
public class BaseController {
private static Logger logger = LoggerFactory.getLogger(IndexController.class);
@RequestMapping
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
String requestURI = request.getRequestURI();
StringBuffer requestURL = request.getRequestURL();
logger.info("-----requestURI => " + requestURI + ", requestURL => " + requestURL);
request.getRequestDispatcher(requestURI).forward(request, response);
logger.info("-----response has been commited");
} catch (Throwable t) {
t.printStackTrace();
request.getRequestDispatcher("/handleException").forward(request, response);
}
}
}
我需要所有传入的请求都通过这个 BaseController 才能创建一个全局 TRY-CATCH 块。我该如何实施?这种方法真的是个好主意吗?也许还有其他一些很棒的方法?
解决方案
如果您想在进入控制器方法之前拦截对控制器端点的每个请求,则需要实现一个filter
. 您可以通过本教程了解如何实现过滤器。
如果您想在一个地方捕获因对控制器端点的请求而导致的所有异常(异常可能已在任何地方抛出 - 控制器、服务、存储库等),那么您应该ExceptionHandler
在ControllerAdvice
. 一个简单的例子是这样的:
@ControllerAdvice
public class ExceptionHandlerAdvice {
@ExceptionHandler(MismatchedInputException.class)
public ResponseEntity<Void> handleMismatchedInputException(MismatchedInputException e) {
return ResponseEntity.status(BAD_REQUEST).build();
}
@ExceptionHandler(InvalidFormatException.class)
public ResponseEntity<Void> handleInvalidFormatException(InvalidFormatException e) {
return ResponseEntity.status(UNPROCESSABLE_ENTITY).build();
}
}
以上将确保在异常处理程序中指定的任何异常都将在此处捕获,以便可以简化来自 REST API 的异常响应。更多关于相同的here。
推荐阅读
- python - 使用 RegEx 逐行遍历日志文件以查找 IP 地址模式。每个 IP 都需要使用 extend 方法将每个 ip 添加到列表 IPS
- ruby-on-rails - Rails 6.1.1 中未更新的固件
- sql - 查找在 X 范围日期发表第一条评论的帖子数
- drupal-8 - Drupal-8 最佳安全设置
- .htaccess - 如何将子域重定向到特定文件夹?
- python - 有没有办法从由字符串组成的列中的所有值中删除字符串字符?
- godot - Godot 3.2.3 在启动时崩溃
- python - Django Annotation 聚合速度
- python - 查找列表中唯一的奇数或唯一的偶数
- c++ - 如何以自定义类型的二维向量作为参数正确定义类成员函数?(C++)