我有两个@RestController类@RequestMapping("/persons")
和@RequestMapping("/person")
,它们都可以抛出PersonAccessException,这是一个自定义异常。并由@ExceptionHandler处理
将来还会有更多的@RestControllers可能引发此异常,就像在不同的地方一次又一次地编写相同的方法不可行一样,我不确定是否可以复制并粘贴此完全相同的异常不同的休息控制器中的处理程序。
我想知道是否有一次可以编写它,然后像普通方法一样在不同的类中使用它。
答案 0 :(得分:1)
在两个不同的@RestController类中具有两个完全相同的@ExceptionHandler是不好的做法吗?
->只是避免代码重复并提高可重用性。
Spring提供了一种定义全局异常处理程序的方法,该方法将应用于应用程序(Web应用程序上下文)中的所有控制器。
我们可以使用@ControllerAdvice
注释来定义将处理全局异常的类。可以将用@ControllerAdvice
注释的类显式声明为Spring Bean,也可以通过类路径扫描自动检测。
有关更多信息,ControllerAdvice
我们可以使用@ExceptionHandle
注释定义特定于异常的异常处理程序(方法)。用@ExceptionHandle
注释的方法可以在多个@Controller类之间共享。
适用于Web应用程序上下文中所有@Controller类的全局异常处理程序的示例,
/**
* <p>This class is to demonstrate global exception handling in spring mvc.</p>
* <p>This class is declared under *.web package, so it will be detected by dispatcher servlet and will be part of web application context created by dispatcher servlet</p>
* <br/> It make more sese to declare these classes as a part of web app context and not part of root context because, we do not want these classes to be able to get injected into root context beans.
* <br/>
* This class can handle exceptions thrown from <br/>
*</t> 1. All controllers in application. <br/>
*</t> 2. All interceptors in applications.
*
*
*/
@ControllerAdvice // We can us attributes of this annotation to limit which controllers this exception handler advise should apply/advise. If we we do not specify, it will be applied to all controllers in web application context.
public class GlobalExceptionHandler {
@ResponseStatus(code = HttpStatus.NOT_FOUND)
@ExceptionHandler(SpittleNotFoundException.class)
public ModelAndView handleSpittleNotFoundException(SpittleNotFoundException exception) {
// all code in this is exactly similar to request handling code in controller
ModelAndView modelAndView = new ModelAndView("errors/notFound");
modelAndView.addObject("errorMessage", exception.getMessage());
return modelAndView;
}
@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Throwable.class)
public String handleGenericException(Throwable exception) {
return "errors/internalServerError";
}
}
Spring docs链接,