Spring Boot | 예외 처리 | 모든 예외 처리하기

코드 작성

src/main/java/sample/springboot/web/MyExceptionResolver.java

package sample.springboot.web;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

@Component
public class MyExceptionResolver implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println(ex.getClass() + " : " + ex.getMessage());

        ModelAndView mv = new ModelAndView();
        mv.setViewName("my-error");

        return mv;
    }
}

src/main/resources/templates/my-error.html

<h1>My Error Page</h1>

src/main/java/sample/springboot/web/WebApiController.java

package sample.springboot.web;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class WebApiController {

    @RequestMapping(method=RequestMethod.GET)
    public void method1() {
        throw new MyException("test exception");
    }

    @RequestMapping(value="/null", method=RequestMethod.GET)
    public void method2() {
        throw new NullPointerException("test exception");
    }
}

실행 결과

curl으로 테스트하기

$ curl http://localhost:8080/api
{"timestamp":1430490625809,"status":400,"error":"Bad Request","exception":"sample.springboot.web.MyException","message":"test exception","path":"/api"}

$ curl http://localhost:8080/api/null
<h1>My Error Page</h1>

서버 콘솔 출력

class java.lang.NullPointerException : test exception

설명

  • HandlerExceptionResolver을 구현한 클래스를 생성하고, @Component로 컨테이너에 등록한다.
  • 그러면 컨트롤러에서 예외가 발생하면 등록된 클래스의 resolveException () 메소드가 호출된다.
  • 그러나 @ResponseStatus로 주석 된 클래스가 발생 된 경우는 불리지 않는다.
  • resolveException () 메소드는 ModelAndView를 반환 하도록 되어 있기 때문에 어떤 페이지를 표시 할 수 있다.