您好,登录后才能下订单哦!
在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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。