首页 > 解决方案 > 为 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 块。我该如何实施?这种方法真的是个好主意吗?也许还有其他一些很棒的方法?

标签: springspring-mvccontroller

解决方案


如果您想在进入控制器方法之前拦截对控制器端点的每个请求,则需要实现一个filter. 您可以通过本教程了解如何实现过滤器。

如果您想在一个地方捕获因对控制器端点的请求而导致的所有异常(异常可能已在任何地方抛出 - 控制器、服务、存储库等),那么您应该ExceptionHandlerControllerAdvice. 一个简单的例子是这样的:

@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


推荐阅读