Spring @将RestControllerAdvice和@ControllerAdvice放在一起

Spring @将RestControllerAdvice和@ControllerAdvice放在一起,spring,exception-handling,controller,spring-restcontroller,Spring,Exception Handling,Controller,Spring Restcontroller,我有一个SpringMVC应用程序,它有@Controllers和@RestControllers。 我在想:当我的@Controller出现异常时,它将由我的@ControllerAdvice处理;当我的@RestController出现异常时,它将由我的@RestControllerAdvice处理。。。但现在我认为这不是事情应该如何运作,因为我的@ControllerAdvice正在捕获一切,甚至是@RestController引发的任何异常……我不知道这是否应该发生。这是我的代码: @

我有一个SpringMVC应用程序,它有
@Controller
s和
@RestController
s。 我在想:当我的
@Controller
出现异常时,它将由我的
@ControllerAdvice
处理;当我的
@RestController
出现异常时,它将由我的
@RestControllerAdvice
处理。。。但现在我认为这不是事情应该如何运作,因为我的
@ControllerAdvice
正在捕获一切,甚至是
@RestController
引发的任何异常……我不知道这是否应该发生。这是我的代码:

 @ControllerAdvice
 public class ExceptionHandlerController {

 private final String DEFAULT_ERROR_VIEW = "error/default";

  @ExceptionHandler(Exception.class)
  public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) 
  {   
      ModelAndView mav = new ModelAndView();
      mav.addObject("exception", e);
      mav.addObject("danger", e.getMessage());
      mav.addObject("url", req.getRequestURL());
      mav.setViewName(DEFAULT_ERROR_VIEW);
      return mav;
  }
}


@RestControllerAdvice
public class ExceptionHandlerRestController {

  @ExceptionHandler(Exception.class)
  public ResponseEntity<String> defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
      return new ResponseEntity<>(" test "+e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);        
  }    
}
@ControllerAdvice
公共类例外HandlerController{
私有最终字符串DEFAULT\u ERROR\u VIEW=“ERROR/DEFAULT”;
@ExceptionHandler(Exception.class)
公共模型和视图defaultErrorHandler(HttpServletRequest请求,异常e)
{   
ModelAndView mav=新ModelAndView();
mav.addObject(“异常”,e);
mav.addObject(“危险”,e.getMessage());
mav.addObject(“url”,req.getRequestURL());
mav.setViewName(默认错误视图);
返回mav;
}
}
@再控制建议
公共类例外HandlerRestController{
@ExceptionHandler(Exception.class)
公共响应属性defaultErrorHandler(HttpServletRequest请求,异常e)引发异常{
返回新的响应属性(“test”+e.getMessage(),HttpStatus.INTERNAL_SERVER_ERROR);
}    
}

是的@RestControllerAdvice不是那样工作的。这只是一个@ControllerAdvice,自动假定了@ResponseBody。看

如果您希望一个@ControllerAdvice与一个控制器一起工作,另一个与另一个控制器一起工作,那么如果您将控制器放在单独的软件包中,您应该能够通过执行以下操作来实现这一点:

@ControllerAdvice("my.controller1.package")

然而,@ControllerAdvice的全部目的是在彼此之间共享单独的@Controllers的共同功能,因此如果您希望它们做单独的事情,您最好将这些方法放在@Controllers本身中。

谢谢,所以,如果我把我的控制器和RestControllers放在一些分离的包中,我就能做类似的事情了@ControllerAdvice(“com.controller”)和@RestControllerAdvice(“com.controller.rest”),因此控制器上的异常将由ControllerAdvice处理,而controller.rest上的异常将由RestControllerAdvice处理?ControllerAdvice仍然处理一切。。。也许更具体的软件包,我现在就试试……是的,现在可以了。。。。我已经将软件包改为@RestControllerAdvice(“com.rest.controller”)而不是@RestControllerAdvice(“com.controller.rest”),现在可以使用了。很好,我很高兴我能帮上忙:)