728x90

GlobalCatcher.java
package com.web.ch3;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
//@ControllerAdvice 모든 패키지 컨트롤러에서 발생하는 예외를 받아서 처리 가능
@ControllerAdvice("com.web.ch3") //해당 패키지 의 컨트롤러 것만 처리 가능
public class GlobalCatcher {
@ExceptionHandler( {Exception.class, NullPointerException.class} ) ## 배열로 선언
public String catcher(Exception ex , Model m) { ## 예외처리 메서드
m.addAttribute("ex" , ex);
return "error";
}
}
ExceptionController.java
package com.web.ch3;
import java.io.FileNotFoundException;
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 {
## GlobalCatcher controller 와 예외 처리 메서드가 중복되는 경우
가까이 있는 ExceptionController 에서 먼저 처리한다.
GlobalCatcher 컨트롤러에서 모두 처리 가능하므로 중복이 되도록 안되게 처리한다.
## ExceptionController 에서만 처리 가능( 다른 컨트롤러의 예외를 처리 하지 못함 )
@ExceptionHandler( {Exception.class, NullPointerException.class} )
public String catcher(Exception ex , Model m) { ## 예외처리 메서드
m.addAttribute("ex" , ex);
return "error";
}
__________________________________________________
@RequestMapping("/ex")
public String main() throws Exception{
throw new Exception("예외가 발생 ^^");
}
@RequestMapping("/ex2")
public String main2( Model m ) throws Exception{
## 이 메서드의 Model 과 catcher 의 Model 은 다른 객체이다.
## View 로 전달하기 위한 model
throw new NullPointerException("예외가 발생 ^^");
}
@RequestMapping("/ex3")
public String main3() throws Exception{
throw new FileNotFoundException("예외가 발생 ^^");
}
}
error.jsp
<%@ page contentType="text/html;charset=utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>error.jsp</title>
</head>
<body>
<h1>예외가 발생했습니다.</h1>
발생한 예외 : ${ex}<br>
예외 메시지 : ${ex.message}<br>
<ol>
<c:forEach items="${ex.stackTrace}" var="i">
<li>${i.toString()}</li>
</c:forEach>
</ol>
</body>
</html>
만약 jsp 페이지에 isErrorPage="true" 를 정의한다면
GlobalCatcher.java , ExceptionController 에서
m.addAttribute("ex" , ex); 안써도 전달이 된다.
<%@ page contentType="text/html;charset=utf-8" isErrorPage="true" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>error.jsp</title>
</head>
<body>
<h1>예외가 발생했습니다.</h1>
발생한 예외 : ${pageContext.exception}<br>
예외 메시지 : ${pageContext.exception.message}<br>
<ol>
<c:forEach items="${pageContext.exception.stackTrace}" var="i">
<li>${i.toString()}</li>
</c:forEach>
</ol>
</body>
</html>
@ResponseStatus
1. 응답 메시지의 상태 코드를 변경할때
@ResponseStatus( HttpStatus.METHOD_NOT_ALLOWED )
@ExceptionHandler( {Exception.class, NullPointerException.class} )
public String catcher(Exception ex , Model m) { //exception 발생시
m.addAttribute("ex" , ex);
return "error";
}
2. 사용자 정의 예외 클래스를 정의할때
@ResponseStatus( HttpStatus.BAD_REQUEST )
class MyException extends RuntimeException {
MyException(String msg ){ super(msg); }
MyException(){ this(""); }
}
에러 코드 별로 View page 지정 ( web.xml )
<error-page>
<error-code>400</error-code>
<location>/error400.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error500.jsp</location>
</error-page>

예외 종류별 View 맵핑 ( servlet-context.xml )
- SimpleMappingExceptionResolver

<beans:bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<beans:property name="defaultErrorView" value="error"/>
<beans:property name="exceptionMappings">
<beans:props>
<beans:prop key="com.fastcampus.ch2.MyException">error400</beans:prop>
</beans:props>
</beans:property>
<beans:property name="statusCodes">
<beans:props>
<beans:prop key="error400">400</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
단, 만약에 jsp 에 <%@ page contentType="text/html;charset=utf-8" isErrorPage="true" %>
isErrorPage="true" 로 되어 있다면, 에러코드는 위xml 내용이 반영되지 않고
500(기본) 으로 표시된다.
728x90