같은 컨트롤러에 @ExceptionHandler 어노테이션을 적용한 메서드가 존재하면, 스프링은 그 메서드가 익셉션을 처리하도록 한다.
따라서, 컨트롤러에 발생한 익셉션을 직접 처리하고 싶다면 @ExceptionHandler 어노테이션을 적용한 메서드를구현해주면 된다.
@Controller public class MemberDetailController { ... @RequestMapping("/member/detail/{id}") public String detail(@PathVariable("id") Long memId, Model model) { Member member = memberDao.selectById(memId); if (member == null) { throw new MemberNotFoundException(); } model.addAttribute("member", member); return "member/memberDetail"; } @ExceptionHandler(TypeMismatchException.class) public String handleTypeMismatchException(TypeMismatchException ex) { // ex 사용해서 로그 남기는 등 작업 return "member/invalidId"; } @ExceptionHandler(MemberNotFoundException.class) public String handleNotFoundException() throws IOException { return "member/noMember"; } }
이렇게하면 컨트롤러에서 에러가 날 경우 익셉션을 전달하는 것이 아니라, 컨트롤러 내부에서 직접 에러를 처리하게 된다.
@ControllerAdvice
@ControllerAdivice는 하나의 컨트롤러가 아닌 여러컨트롤러에서 하나의 익셉션을 처리할 때 사용된다.
@ControllerAdivce("chap13.spring") public class CommonExceptionHandler { @ExceptionHandler(RuntimeException.class) private ModelAndView errorModelAndView(Exception ex) { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("/error_common"); modelAndView.addObject("exception", ex ); return modelAndView; } }
이렇게 M&V 를 사용하면 뷰와, 모델객체를 같이 보낼 수 있다.
참고
- http://blog.naver.com/xcv1524/220497274201
댓글 없음:
댓글 쓰기
참고: 블로그의 회원만 댓글을 작성할 수 있습니다.