반응형
@ExcptionHandler 와 @ControllerAdvice
@ExcptionHandler
- 예외 처리를 위한 메서드 작성 후 어노테이션을 해준다
package com.springmvcstudy.ch2;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ExceptionController {
@ExceptionHandler(Exception.class)
public String catcher(Exception ex, Model m) {
System.out.println("catcher() is in ExceptionController");
System.out.println("m=" + m);
m.addAttribute("ex", ex);
return "error";
}
@ExceptionHandler(NullPointerException.class)
public String catcher2(Exception ex, Model m) {
m.addAttribute("ex", ex);
return "error";
}
@RequestMapping("/ex")
public String main(Model m) throws Exception { //Model은 chatcher() Model과 다
m.addAttribute("msg", "message from ExcptionController.main()");
throw new Exception("예외가 발생했습니다.");
}
@RequestMapping("/ex2")
public String main2() throws Exception {
throw new NullPointerException("NullPoint 예외가 발생했습니다.");
}
}
@ControllerAdvice
- ControllerAdivce로 전역 예외처리 클래스 작성이 가능 ( 패키지 지정 가능 )
예외 처리 메서드가 중복된 경우, 컨트롤러 내의 예외 처리 메서드가 우선임
package com.springmvcstudy.ch2;
import java.io.FileNotFoundException;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice("com.springmvcstudy.ch2") // 패키지 지정
//@ControllerAdvice() // 모든 패키지 지정
public class GlobalCatcher {
@ExceptionHandler(Exception.class)
public String catcher(Exception ex, Model m) {
m.addAttribute("ex", ex);
return "error";
}
@ExceptionHandler({NullPointerException.class, FileNotFoundException.class})
public String catcher2(Exception ex, Model m) {
m.addAttribute("ex", ex);
return "error";
}
}
@ResponseStatus
- 응답 메세지의 상태 코드를 변경할 때 사용
package com.springmvcstudy.ch2;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
@Controller
public class ExceptionController {
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) // 200 >> 500
public String catcher(Exception ex, Model m) {
System.out.println("catcher() is in ExceptionController");
System.out.println("m=" + m);
m.addAttribute("ex", ex);
return "error";
}
@RequestMapping("/ex")
public String main(Model m) throws Exception { //Model은 chatcher() Model과 다
m.addAttribute("msg", "message from ExcptionController.main()");
throw new Exception("예외가 발생했습니다.");
}
}
<error-page> - web.xml
- 상태 코드별 뷰 맵핑
반응형
'Spring' 카테고리의 다른 글
[스프링의 정석] Transaction, Commit, Rollback (0) | 2023.04.21 |
---|---|
[스프링의 정석] Spring DI 활용하기 / @annotation (0) | 2023.04.19 |
[스프링의 정석] Spring DI 흉내내기 (0) | 2023.04.18 |
[스프링의 정석] Http, 컨트롤러 메서드의 반환타입 (0) | 2023.04.10 |
Spring MVC Project / 개발환경 설정 (0) | 2023.04.06 |