selfstarter

@ControllerAdvice JavaConfig 본문

Server/Spring

@ControllerAdvice JavaConfig

selfstarter 2019. 7. 1. 16:47

@ControllerAdvice JavaConfig

예외 처리

- 예외상황을 예외 클래스를 만들어서 처리하면 예외 처리 중복 코드를 없앨 수 있다

- @ControllerAdvice는 오류를 처리하는 Controller임을 나타내는 어노테이션

- CommonExceptionAdvice class 생성

- @ ComponentScan 어노테이션으로 CommonExceptionAdvice class를 검색할 수 있도록 만든다

 

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.http.HttpStatus;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.ControllerAdvice;

import org.springframework.web.bind.annotation.ExceptionHandler;

import org.springframework.web.bind.annotation.ResponseStatus;

import org.springframework.web.servlet.NoHandlerFoundException;

@ControllerAdvice

public class CommonExceptionAdvice {

     

     private static final Logger logger =  LoggerFactory.getLogger(CommonExceptionAdvice.class);

     // exception 이 발생하고 try~catch 문이 아닌 호출된 곳에서  처리하도록 하면 여기에 들어온다

     @ExceptionHandler(Exception.class)

     public String except(Exception ex, Model model) {

           logger.info("Exception........" + ex.getMessage());

           model.addAttribute("exception", ex);

           logger.error(model.toString());

           return "error/error_page";

     }

}

 

- 에러 페이지 생성

- 깔끔한 error text 여러줄이 출력된다

 

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%@ page session="false" import="java.util.*" %>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Error Page</title>

</head>

<body>

     <h4><c:out value="${exception.getMessage()}"></c:out></h4>

     <ul>

           <c:forEach items="${exception.getStackTrace() }"  var="stack" >

                <li><c:out value="${stack}"></c:out></li>

           </c:forEach>

     </ul>

</body>

</html>

 

404에러 처리

- 404에러 처리는 NoHandlerFoundException.class 에러가 발생한다

- @ResponseStatus는 응답값에 특정한 상태값을 전달한다

- CommonExceptionAdvice class 내에 정의한다

 

@ExceptionHandler(NoHandlerFoundException.class)

@ResponseStatus(HttpStatus.NOT_FOUND)

public String handle404(NoHandlerFoundException ex) {

    

    return "error/error_404";

}

 

- 404 jsp 페이지를 추가한다

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Error Page</title>

</head>

<body>

     <h1>404 찾을 수 없는 페이지 입니다</h1>

</body>

</html>

 

- WebConfig class에서 customizeRegistration 함수를 재정의 한다

@Override

protected void customizeRegistration(ServletRegistration.Dynamic registration) {
    registration.setInitParameter("throwExceptionIfNoHandlerFound", "true");
}

 

- servlet api는 3.0 버전 이상이여야 한다

- pom.xml

<dependency>

    <groupId>javax.servlet</groupId>

    <artifactId>javax.servlet-api</artifactId>

    <version>3.0.1</version>

    <scope>provided</scope>

</dependency>

Comments