在Spring MVC项目中,异常处理是一个非常重要的环节。良好的异常处理机制可以提高系统的健壮性,提升用户体验,并且有助于开发人员快速定位和解决问题。本文将详细介绍如何在Spring MVC项目中配置异常处理。
@ControllerAdvice
和@ExceptionHandler
@ControllerAdvice
和@ExceptionHandler
是Spring MVC中用于全局异常处理的注解。通过这两个注解,我们可以定义一个全局的异常处理类,集中处理所有控制器中抛出的异常。
首先,我们需要创建一个全局异常处理类,并使用@ControllerAdvice
注解标记该类。然后,在该类中定义处理特定异常的方法,并使用@ExceptionHandler
注解标记这些方法。
import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.context.request.WebRequest; @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<?> handleGlobalException(Exception ex, WebRequest request) { // 处理全局异常 return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } @ExceptionHandler(ResourceNotFoundException.class) public ResponseEntity<?> handleResourceNotFoundException(ResourceNotFoundException ex, WebRequest request) { // 处理资源未找到异常 return new ResponseEntity<>("Resource not found: " + ex.getMessage(), HttpStatus.NOT_FOUND); } }
在上面的代码中,我们处理了一个自定义的ResourceNotFoundException
异常。我们可以通过创建一个自定义异常类来实现这一点。
public class ResourceNotFoundException extends RuntimeException { public ResourceNotFoundException(String message) { super(message); } }
在控制器中,我们可以抛出这些自定义异常,Spring MVC会自动调用相应的异常处理方法。
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class MyController { @GetMapping("/resource/{id}") public String getResource(@PathVariable Long id) { if (id == null) { throw new ResourceNotFoundException("Resource not found with id: " + id); } return "Resource found"; } }
@ResponseStatus
注解@ResponseStatus
注解可以用于自定义异常类上,指定当该异常抛出时返回的HTTP状态码。
import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @ResponseStatus(value = HttpStatus.NOT_FOUND) public class ResourceNotFoundException extends RuntimeException { public ResourceNotFoundException(String message) { super(message); } }
当ResourceNotFoundException
异常抛出时,Spring MVC会自动返回404状态码。
HandlerExceptionResolver
HandlerExceptionResolver
是Spring MVC中用于处理异常的接口。我们可以通过实现该接口来自定义异常处理逻辑。
HandlerExceptionResolver
import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Component public class CustomHandlerExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { ModelAndView modelAndView = new ModelAndView(); if (ex instanceof ResourceNotFoundException) { modelAndView.setViewName("error/404"); modelAndView.addObject("errorMessage", ex.getMessage()); response.setStatus(HttpStatus.NOT_FOUND.value()); } else { modelAndView.setViewName("error/500"); modelAndView.addObject("errorMessage", "An unexpected error occurred"); response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); } return modelAndView; } }
HandlerExceptionResolver
在Spring MVC配置中,我们可以将自定义的HandlerExceptionResolver
添加到DispatcherServlet
的异常解析器列表中。
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.List; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) { resolvers.add(customHandlerExceptionResolver()); } @Bean public HandlerExceptionResolver customHandlerExceptionResolver() { return new CustomHandlerExceptionResolver(); } }
ErrorController
处理未捕获的异常ErrorController
是Spring Boot中用于处理未捕获异常的接口。我们可以通过实现该接口来自定义错误页面或错误响应。
ErrorController
import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; @Controller public class CustomErrorController implements ErrorController { @RequestMapping("/error") public String handleError(HttpServletRequest request) { // 获取错误状态码 Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code"); if (statusCode == 404) { return "error/404"; } else { return "error/500"; } } @Override public String getErrorPath() { return "/error"; } }
在src/main/resources/templates
目录下创建error/404.html
和error/500.html
文件,分别用于显示404和500错误页面。
<!-- error/404.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>404 Not Found</title> </head> <body> <h1>404 Not Found</h1> <p>The requested resource was not found.</p> </body> </html> <!-- error/500.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>500 Internal Server Error</title> </head> <body> <h1>500 Internal Server Error</h1> <p>An unexpected error occurred.</p> </body> </html>
在Spring MVC项目中,异常处理可以通过多种方式实现。@ControllerAdvice
和@ExceptionHandler
注解提供了全局异常处理的机制,@ResponseStatus
注解可以用于自定义异常的状态码,HandlerExceptionResolver
接口允许我们自定义异常处理逻辑,而ErrorController
接口则用于处理未捕获的异常。通过合理配置这些机制,我们可以构建一个健壮且易于维护的异常处理系统。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。