스프링 예외처리,@ExceptionHandler,@ControllerAdvice를 이용한 컨트롤러 예외처리(자바교육학원/스프링교육학원/JAVA교육학원/Spring교육학원)
http://ojc.asia/bbs/board.php?bo_table=LecSpring&wr_id=887
ojc.asia
https://www.youtube.com/watch?v=OXnif975EoQ&list=PLxU-iZCqT52B7oCYJltUT2-kBzckdr5vp&index=12&t=11s

https://www.youtube.com/watch?v=YlXpUGYXrKQ&list=PLxU-iZCqT52B7oCYJltUT2-kBzckdr5vp&index=10

- 컨트롤러 기반 예외처리
컨트롤러 내부 메소드 위에 @ExceptionHandler를 사용하면 된다. 스프링은 컨트롤러 안에 @ExceptionHandler를 사용한 메소드가 존재하면 그 메소드가 컨트롤러 내부의 예외를 처리하도록 하며 @ExceptionHandler의 인자로 들어오는 예외가 발생하는 경우에 해당 메소드가 실행된다.
@Controller
public class EmpController {
@RequestMapping(value="/emp/{empno}", method=RequestMethod.GET)
public String getEmp(@PathVariable("empno") int empno, Model model) {
if(empno==null) throw new EmpNotFoundException(id);
else { ...... }
}
@ExceptionHandler(EmpNotFoundException.class) //EmpNotFoundException에 대한 예외처리 메소드
public ModelAndView exHandler(HttpServletRequest request, Exception ex){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("exception", ex);
modelAndView.addObject("url", request.getRequestURL());
modelAndView.setViewName("error");
return modelAndView;
}
}
- 글로벌 예외처리
@ExceptionHandler : 스프링 @MVC에서 에러나 예외를 처리하기 위한 특별한 방법을 제공하는데 @ExceptionHandler 어노테이션을 이용하면 된다. 스프링 컨트롤러에서 정의한 메소드에서 기술한 예외가 발생되면 자동으로 받아낼 수 있다. 이를 이용하여 컨트롤러에서 발생하는 예외를 View단 JSP등으로 보내서 처리할 수 있다.
@ControllerAdvice : @ControllerAdvice는 스프링3.2 이상에서 사용가능하며 @Controller 나 스프링 4.0이상에서 지원하는 @RestController 에서 발생하는 예외 등을 catch하는 기능을 가지고 있다. 클래스 위에 @ControllerAdvice를 붙이고 어떤 예외를 잡아낼 것인지 내부 메소드를 선언하여 메소드 상단에 @ExceptionHandler(예외클래스명.class)를 기술한다. 스프링4.0이상에서는 특정한 컨트롤러만 지정해서 캐치할 수 있다.
STS에서
File >> New >> Spring Legacy Project
Project Name : springmvcexception
Spring MVC Project 선택
다음 화면의 top level package에서 a.b.springmvcexception 입력
[pom.xml]
Spring Framework 버전이 4.X 아래라면 수정하자.
<properties>
……
<org.springframework-version>4.2.4.RELEASE</org.springframework-version>
……
</properties>
[HomeController.java]
package a.b.springmvcexception;
import java.io.IOException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HomeController {
@RequestMapping(value = "/")
public String hello() throws IOException {
// 뷰이름 이름, hello.jsp 호출
return "home";
}
@RequestMapping(value = "/test")
public String test() throws IOException {
{
throw new IOException("occured IOException...");
}
}
}
[ExceptionControllerAdvice.java]
package a.b.springmvcexception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
@ControllerAdvice
public class ExceptionControllerAdvice {
@ExceptionHandler(Exception.class)
public ModelAndView exception(Exception e) {
ModelAndView mav = new ModelAndView("exception");
mav.addObject("name", e.getClass().getSimpleName());
mav.addObject("message", e.getMessage());
return mav;
}
}
[ webapp/WEB-INF/views/home.jsp]
<html>
<head>
<title>Spring MVC Exception Handling</title>
</head>
<body>
<h1>Spring MVC Exception Handling</h1>
<a href="/springmvcexception/test">Click here to test Exception handling</a>
</body>
</html>
[ webapp/WEB-INF/views/exception.jsp]
<html>
<head>
<title>Spring MVC Exception example</title>
</head>
<body>
<h1>Error Handing Page</h1>
<b>${name}</b>: ${message}
</body>
</html>
[실행]
프로젝트에서 우쪽 마우스 버튼 -> Run as -> Run On Server 클릭 후 STS에 기본적으로 내장되어 있는 Pivotal tc Server를 선택하고 Finish를 클릭하여 실행하자
http://localhost:8080/springmvcexception/

"Click here to test Exception handling "를 클릭하자
exception.jsp에서 예외를 받아서 출력한다.

- Spring4 @RestController 컨트롤러 기반 예외처리
@RestController @RequestMapping("/emp")
public class EmpController {
@ExceptionHandler(EmpNotFoundException.class) //EmpNotFoundException 예외처리용
public ErrorDetail myError(HttpServletRequest request, Exception exception) {
ErrorDetail error = new ErrorDetail();
error.setStatus(HttpStatus.BAD_REQUEST.value());
error.setMessage(exception.getLocalizedMessage());
error.setUrl(request.getRequestURL().append("/emperror/").toString());
return error;
}
@RequestMapping("/get")
public Emp getEmp(@RequestParam(value="empno") String empno) {
if (empno == null) throw new EmpNotFoundException(empno);
......
return emp; } }
public class EmpNotFoundException extends RuntimeException {
public EmpNotFoundException(String empno){
super(empno +" not found!");
}
}
http://localhost:8080/emp/get?empno=9999
존재하지 않는 사원이라면 오류는 JSON 형태로 리턴된다.
{"status":400,"message":"9999 not found!","url":"http://localhost:8080/emp/get/emperror/"}
- Spring4 @RestController 글로벌 예외처리
@RestController
@RequestMapping("/emp")
class EmpApiController {
@RequestMapping(value = "{empno}", produces = "application/json")
@ResponseStatus(value = HttpStatus.OK)
Emp getEmp(@PathVariable Long empno) {
if (empno == null) throw new EmpNotFoundException(empno); }
}
@ControllerAdvice(annotations = RestController.class)
class ExceptionHandlerAdvice {
@ExceptionHandler(value = EmpNotFoundException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public ErrorDetail myError(HttpServletRequest request, Exception exception) {
ErrorDetail error = new ErrorDetail();
error.setStatus(HttpStatus.BAD_REQUEST.value());
error.setMessage(exception.getLocalizedMessage()); error.setUrl(request.getRequestURL().append("/emperror/").toString());
return error;
}
}
스프링예외, 스프링교육, 스프링학원, 자바교육, 자바학원, ExceptionHandler,ControllerAdvice,자바교육학원,스프링교육학원,JAVA교육학원,Spring교육학원
#스프링예외, #스프링교육, #스프링학원, #자바교육, #자바학원, #ExceptionHandler,#ControllerAdvice,#자바교육학원,#스프링교육학원,#JAVA교육학원,#Spring교육학원