package sample.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* エラー処理に関するハンドラ・メソッドのサンプルを実装したコントローラ.
* クラス・レベルで{@link RequestMapping}を使用することでベースとなるパスを指定している。
* ここで指定されたパスは、個別のハンドラ・メソッドで指定しているパスの接頭辞として連結される。
*/
@Controller
@RequestMapping("/error")
public class ErrorHandlingSampleController {
@RequestMapping({"/", "/index"})
public String index() {
return "/error/index";
}
/**
* コントローラ・クラスそのものに実装された例外ハンドラを使用する例.
* @return (このメソッドは決して値を返さない)
*/
@RequestMapping("/handled-by-controller-themself")
public String handledByControllerThemself() {
throw new HandledByControllerThemselfException();
}
/**
* 別クラスで実装された例外ハンドラ(AOPにより関連付けられる)を使用する例.
* 例外ハンドラは{@link SampleExceptionHandlerAdvice}で実装されている。
* @return (このメソッドは決して値を返さない)
*/
@RequestMapping("/handled-by-controller-advice")
public String handledByControllerAdvice() {
throw new HandledByControllerAdviceException();
}
/**
* 例外リゾルバの実装を使用する例.
* ハンドラ・メソッド内で発生した例外は、
* コントローラ独自の例外ハンドラやAOPで関連付けられた例外ハンドラにキャッチされなかった場合、
* ハンドラ例外リゾルバ({@link HandlerExceptionResolver}の実装)に処理を委ねられる。
* @return (このメソッドは決して値を返さない)
*/
@RequestMapping("/handled-by-resolver")
public String handledByResolver() {
throw new HandledByResolverException();
}
@ExceptionHandler(HandledByControllerThemselfException.class)
public String handleError(Exception ex) {
ex.printStackTrace();
return "/error/handled-by-controller-themself";
}
public static class HandledByControllerThemselfException extends RuntimeException {
private static final long serialVersionUID = -7831839265054767287L;
}
public static class HandledByControllerAdviceException extends RuntimeException {
private static final long serialVersionUID = -7831839265054767287L;
}
public static class HandledByResolverException extends RuntimeException {
private static final long serialVersionUID = -7831839265054767287L;
}
}