下面我将详细讲解Spring异常实现统一处理的方法。
背景
在Spring应用程序中,系统可能会出现各种异常,如数据库连接异常、空指针异常等等。这些异常可能会导致应用程序崩溃或无法正常运行,对于程序员,处理这些异常非常重要。而在处理异常时,统一处理异常是一种最佳的方法。
实现步骤
第一步:全局异常处理类
编写一个全局异常处理类,该类应该用@ControllerAdvice来标注。这个注解表明,这个类是用来处理控制器(Controller)中所有方法抛出的异常。
以下是一个简单的全局异常处理类示例:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public ModelAndView handleException(Exception e){
ModelAndView modelAndView=new ModelAndView();
modelAndView.setViewName("error");
modelAndView.addObject("errorMsg",e.getMessage());
return modelAndView;
}
}
这里使用 @ExceptionHandler 注解指定了处理的异常类型,这里是Exception。然后在方法中处理异常,并返回一个ModelAndView对象来渲染异常的错误页面。errorMessage是在模板中用来展示错误信息的变量名称。
第二步:标注异常处理类
在使用@ControllerAdvice注解的类中,使用@ExceptionHandler,@InitBinder和@ModelAttribute注解标注异常处理方法。
- @ExceptionHandler:处理单个方法中的异常;
- @InitBinder:用于请求参数的预处理;
- @ModelAttribute:修饰方法,将值绑定到Model中。
以下是@ExceptionHandler的示例:
@ExceptionHandler(value = Exception.class)
public ModelAndView handleException(Exception e){
ModelAndView modelAndView=new ModelAndView();
modelAndView.setViewName("error");
modelAndView.addObject("errorMsg",e.getMessage());
return modelAndView;
}
这里我们针对Exception类型的异常进行处理,并将错误信息添加到模型中。
以下是@InitBinder的示例:
@InitBinder
public void initBinder(WebDataBinder binder){
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class,new CustomDateEditor(dateFormat,false));
}
这里我们使用@InitBinder注解,指定参数类型为WebDataBinder,然后注册一个定制的属性编辑器(CustomEditor),用来编辑日期类型的属性。
以下是@ModelAttribute的示例:
@ModelAttribute
public void addAttributes(Model model){
model.addAttribute("author","xiaoming");
}
这里我们使用@ModelAttribute注解,将值绑定到Model中,名称为author,值为xiaoming。
第三步:编写错误页面和异常处理页面
在应用程序的资源文件夹下创建一个/templates/error.html文件(文件名可以自定义)。这个文件是用来展示未经处理的异常的错误页面,需要自定义实现。我们可以在这个页面中展示所提供的异常信息并提供重试和返回链接。
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>Oops! Error Occurred</title>
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-qn25LkPA2qRY/UHBlPqku3dnmNMa1oP1G8hPq7415rqO4HSzAK/K1v9KwQmw4lwW" crossorigin="anonymous">
</head>
<body>
<div class="container" style="margin-top: 50px;">
<h1 class="text-danger">Oops! Error Occurred</h1>
<h2>Error Details</h2>
<div class="text-danger">
<pre th:text="${errorMsg}"></pre>
</div>
<a th:href="@{/}" class="btn btn-warning">Go to Home</a>
</div>
</body>
</html>
注意:需要在
标签内包含Bootstrap的CSS文件,这个文件用来渲染异常页面的样式。示例
以下是模拟一个Spring Boot应用程序中的异常处理。
@Controller
public class ExceptionController {
@GetMapping("/null")
public String test(@RequestParam(required = false) Integer id){
if(id==null)
throw new NullPointerException("id is null.");
return "home";
}
@GetMapping("/db")
public String db(@RequestParam Integer id){
if(id==1)
throw new RuntimeException("Database connection failed.");
return "home";
}
}
这个Controller中包含两个方法,一个是抛出空指针异常的,一个是抛出运行时异常的。
接着我们在错误处理页面(error.html)中渲染异常信息:
<pre th:text="${errorMsg}"></pre>
最后,我们通过访问"/null"和"/db"URL来测试这个异常处理机制是否正常工作。
结论
通过上面的步骤,可以实现Spring异常的统一处理,从而使得应用程序更加稳定、可靠。这样我们就可以在整个应用程序中,只使用一种方式来处理异常,减少重复代码,提高代码的可维护性和可读性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring异常实现统一处理的方法 - Python技术站