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

+ Recent posts