Spring MVC项目中的异常处理怎么配置

发布时间:2022-06-07 09:38:42 作者:zzz
来源:亿速云 阅读:156

Spring MVC项目中的异常处理怎么配置

在Spring MVC项目中,异常处理是一个非常重要的环节。良好的异常处理机制可以提高系统的健壮性,提升用户体验,并且有助于开发人员快速定位和解决问题。本文将详细介绍如何在Spring MVC项目中配置异常处理。

1. 使用@ControllerAdvice@ExceptionHandler

@ControllerAdvice@ExceptionHandler是Spring MVC中用于全局异常处理的注解。通过这两个注解,我们可以定义一个全局的异常处理类,集中处理所有控制器中抛出的异常。

1.1 创建全局异常处理类

首先,我们需要创建一个全局异常处理类,并使用@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);
    }
}

1.2 自定义异常类

在上面的代码中,我们处理了一个自定义的ResourceNotFoundException异常。我们可以通过创建一个自定义异常类来实现这一点。

public class ResourceNotFoundException extends RuntimeException {
    public ResourceNotFoundException(String message) {
        super(message);
    }
}

1.3 在控制器中抛出异常

在控制器中,我们可以抛出这些自定义异常,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";
    }
}

2. 使用@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状态码。

3. 使用HandlerExceptionResolver

HandlerExceptionResolver是Spring MVC中用于处理异常的接口。我们可以通过实现该接口来自定义异常处理逻辑。

3.1 实现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;
    }
}

3.2 配置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();
    }
}

4. 使用ErrorController处理未捕获的异常

ErrorController是Spring Boot中用于处理未捕获异常的接口。我们可以通过实现该接口来自定义错误页面或错误响应。

4.1 实现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";
    }
}

4.2 配置错误页面

src/main/resources/templates目录下创建error/404.htmlerror/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>

5. 总结

在Spring MVC项目中,异常处理可以通过多种方式实现。@ControllerAdvice@ExceptionHandler注解提供了全局异常处理的机制,@ResponseStatus注解可以用于自定义异常的状态码,HandlerExceptionResolver接口允许我们自定义异常处理逻辑,而ErrorController接口则用于处理未捕获的异常。通过合理配置这些机制,我们可以构建一个健壮且易于维护的异常处理系统。

推荐阅读:
  1. Spring MVC原理及配置详解
  2. spring MVC配置详解

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springmvc

上一篇:Node的多进程服务如何实现

下一篇:Qt中怎么使用PaintEvent绘制实时波形图

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》