@ExceptionHandler(), @ControllerAdvice, @ResponseStatus

Web Development assistant·2021년 12월 19일
0

# spring

목록 보기
4/32
       @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
       @ExceptionHandler(NullPointerException.class)					
	public String catcher2(Exception ex, Model m) {
		System.out.println("널포인트");
		m.addAttribute("ex", ex);
		return "error";
	}
    
        @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
	@ExceptionHandler(Exception.class)					
	public String catcher(Exception ex, Model m) {
		System.out.println("전역 에러");
		m.addAttribute("ex", ex);
		return "error";
	}
	
	@RequestMapping("/ex")
	public String main() throws Exception {
		throw new Exception("예외를 만듬.");
	}
	@RequestMapping("/ex2")
	public String main2() throws Exception {
		throw new NullPointerException("예외를 만드러따아아아아.");
	}

처음에 exceptionHandler에 model을 넣으니 error.jsp 화면으로 가지 않고 500번 에러 화면을 보여주는 것이였다.
검색해보니 스프링 3.2 버전 이상이 되어야 했었고, 자바 버전 마저 나는 1.6으로 쓰고 있어서,,,,,,,,
pom.xml에서 자바 버전 1.8, 스프링 버전 5버전 대로 수정 후
메이븐 업데이트 하였고 정상적으로 작동함을 확인하였다.

@ExceptionHandler는 각각의 컨틀롤러.class에서 발생하는 에러를try-catch와 같이 발생된 에러를 잡아주는 역할이다.

매번 컨트롤러마다 중복된 @ExceptionHandler를 작성할 순 없으니
GlobalExceptionController를 따로 작성하고,



@ControllerAdvice

import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice("org.zerock.controller") //지정된 패키지에만 적용
//@ControllerAdvice		    	// 모든 패키지에 적용
public class ExceptionContorller2 {
	@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
        @ExceptionHandler(NullPointerException.class)					
	public String catcher2(Exception ex, Model m) {
		System.out.println("널포인트");
		m.addAttribute("ex", ex);
		return "error";
	}
        @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
	@ExceptionHandler(Exception.class)					
	public String catcher(Exception ex, Model m) {
		System.out.println("전역 에러");
		m.addAttribute("ex", ex);
		return "error";
	}
}

이와같이 에러인 경우만들 다루는 컨트롤러를 만들고
@controllerAdvice를 적용했을땐 각각의 컨트롤러에
중복된 @ExceptionHandler 메소드를 사용하지 않아도
모두 에러를 잡아주는걸 확인할 수 있었다.

만약! 전역으로 설정한 에러컨트롤러와 컨트롤러 내의 @ExceptionHandler의 예외처리가 중복된 경우 전역이 아닌 컨트롤러의 예외처리가 우선적으로 처리된다.

@ResponseStatus란??
성공적으로 에러를 캐치하여 에러 페이지를 보여주더라도
이때 상태코드는 200번이다.
분명 에러라고 에러 페이지를 보여주면서 200번대인 어불성설
상태를 수정하기 위해 상태코드를 바꿔주는 어노테이션이다.

<수정전>

<수정후>

0개의 댓글