1

私は@Controller@RestControllerを持つSpring MVCアプリケーションを持っています。 私は考えていた:私は@Controllerでいくつかの例外があるとき、それは私のによって処理されるつもりで、私は@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はそのようには動作しません。 @ResponseBodyが自動的に想定されるのは単なる@ControllerAdviceです。 @RestControllerAdvice vs @ControllerAdviceを参照してください。

あなたが他で動作するように、一方のコントローラと1で動作するように1 @ControllerAdviceを望んでいた場合は、別々のパッケージであなたのコントローラを置けば、あなたがやってこれを行うことができる必要があります:

@ControllerAdvice("my.controller1.package") 

しかし、 @ControllerAdviceの全体的なポイントは、お互いの間で別々の@Controllersの共通の機能を共有することです。もしあなたが別々のことをしたいのであれば、@Controllers自身の中にメソッドを置く方が良いかもしれません。

+0

ありがとうございます。私はコントローラとRestControllersをいくつかのseparetedパッケージに置いていますので、そのようなことをすることができますか? @ControllerAdvice( "com.controller")と@RestControllerAdvice( "com.controller.rest")ので、Controllerの例外はControllerAdviceによってアンドリングされ、例外はController.restのRestControllerAdviceによってアンドリングされますか? –

+0

ControllerAdviceはまだ全てを処理しています...もっと具体的なパッケージかもしれませんが、今私は試してみてください... –

+0

うん、今うまくいく... @RestControllerAdviceの代わりに@RestControllerAdvice( "com.rest.controller" com.controller.rest ")、現在は動作します。 –

関連する問題