1

我有一个Spring MVC应用程序,其中有@Controller s和@RestController s。 我在想:当我在我的@Controller有一些例外,它将由我的@ControllerAdvice处理,当我在我的@RestController有一些例外时,它将由我的@RestControllerAdvice处理...但现在我认为它不是如何事情的工作,因为我的@ControllerAdvice捕捉的一切,即使是抛出@RestController ......我不知道这是否应该发生。在这里我的代码:@RestControllerAdvice和@ControllerAdvice一起

@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);   
    }  
} 

回答

1

是啊@RestControllerAdvice不会这样工作。它只是一个@ControllerAdvice,自动假定@ResponseBody。见@RestControllerAdvice vs @ControllerAdvice

如果你想一个@ControllerAdvice用一个控制器和一个工作与另一个工作,然后,如果你把你的控制器分开包装,你应该能够做这样做:

@ControllerAdvice("my.controller1.package") 

然而, @ControllerAdvice的全部重点是在不同的@Controller之间共享相互独立的@Controllers的通用功能,所以如果你希望他们分开做一些事情,你最好把方法放在@Controllers里面。

+0

谢谢,所以如果我把我的控制器和RestControllers放在一些分离的包中,我将能够做到这样的事情? @ControllerAdvice(“com.controller”)和@RestControllerAdvice(“com.controller.rest”),所以控制器的异常将由ControllerAdvice处理,而controller.rest中的异常将由RestControllerAdvice处理? –

+0

ControllerAdvice仍然处理一切...也许更具体的包,我现在会尝试... –

+0

是啊现在工作....我已经改变包到@RestControllerAdvice(“com.rest.controller”),而不是@RestControllerAdvice(“ com.controller.rest“),现在可以工作。 –