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「),現在可以工作。 –