实际开发中, @RestControllerAdvice和 @ControllerAdvice怎么使用?
-
在实际开发中,
@RestControllerAdvice
和@ControllerAdvice
的使用场景有所不同。@RestControllerAdvice
用于处理 RESTful 接口的异常,而@ControllerAdvice
用于处理传统的 Web 应用程序的异常。下面分别举几个常用开发的实例。使用 @RestControllerAdvice 处理 RESTful 接口异常
在 RESTful 接口开发中,我们通常使用 JSON 格式作为数据交换的格式。当接口发生异常时,我们需要返回一个 JSON 格式的错误信息。这时,可以使用
@RestControllerAdvice
注解来定义一个全局异常处理类,例如:@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<ErrorResponse> handleException(Exception e) { ErrorResponse errorResponse = new ErrorResponse(); errorResponse.setCode(500); errorResponse.setMessage(e.getMessage()); return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR); } }
在上面的代码中,我们定义了一个名为
GlobalExceptionHandler
的类,并使用@RestControllerAdvice
注解标记这个类。然后,我们在这个类中定义了一个名为handleException
的方法,并使用@ExceptionHandler
注解标记这个方法,表示这个方法用于处理所有类型的异常。在这个方法中,我们创建了一个ErrorResponse
对象,并将异常信息设置为错误消息,然后将ErrorResponse
对象和HttpStatus.INTERNAL_SERVER_ERROR
返回。使用 @ControllerAdvice 处理传统 Web 应用程序异常
在传统的 Web 应用程序开发中,我们通常使用 JSP 或 Thymeleaf 等模板引擎来渲染页面。当页面发生异常时,我们需要返回一个错误页面。这时,可以使用
@ControllerAdvice
注解来定义一个全局异常处理类,例如:@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ModelAndView handleException(Exception e) { ModelAndView mav = new ModelAndView(); mav.addObject("exception", e); mav.setViewName("error"); return mav; } }
在上面的代码中,我们定义了一个名为
GlobalExceptionHandler
的类,并使用@ControllerAdvice
注解标记这个类。然后,我们在这个类中定义了一个名为handleException
的方法,并使用@ExceptionHandler
注解标记这个方法,表示这个方法用于处理所有类型的异常。在这个方法中,我们将异常对象添加到 ModelAndView 中,并设置视图名称为error
,最后返回 ModelAndView 对象。除了处理异常之外,
@ControllerAdvice
还可以用于全局数据绑定和全局数据预处理。例如,我们可以使用@ModelAttribute
注解来定义一个全局数据绑定方法:@ControllerAdvice public class GlobalDataBinder { @ModelAttribute("currentUser") public User getCurrentUser() { // 从当前会话中获取用户信息 User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); return user; } }
在上面的代码中,我们定义了一个名为
GlobalDataBinder
的类,并使用@ControllerAdvice
注解标记这个类。然后,我们在这个类中定义了一个名为getCurrentUser
的方法,并使用@ModelAttribute
注解标记这个方法,表示这个方法用于将当前用户绑定到模型中。在这个方法中,我们从当前会话中获取用户信息,并返回一个User
对象。这样,每个控制器方法都可以通过@ModelAttribute("currentUser")
注解来获取当前用户信息。
欢迎转载,转载请标注出处。关注公众号: JAVA大师, 后台回复 资源,既可获取资源链接 !!!