eGovFrame 표준프레임워크 포털

메뉴 건너띄기
상단메뉴 바로가기
본문 바로가기

이 누리집은 대한민국 공식 전자정부 누리집입니다.

본문 영역

적용 지원, FAQ, Q&A 게시판을 통해 기술 문제 해결을 지원합니다.

묻고 답하기

ExceptionHandler
  • 작성자

    왕*호

  • 작성일

    2013-04-25 10:00:13

  • 조회수

    2,036

  • 구분

    기타

  • 진행상태

    완료

질문

스프링 버전: 3.2.2.RELEASED

질문:
@LoginRequired 어노테이션을 생성했습니다.
컨트롤러에서 로그인이 필요한 부분에 @LoginRequired 선언하여
함수가 호출되기전에 Aspect.java의 loginRequired()가 호출됩니다.
만약 로그인이 되지 않았으면 CustomException을 던집니다.

이 때, 스프링 3.2.x 에 추가된 @ControllerAdvice를 이용해
던진 Excepetion을 받도록 했지만 받질 못하네요

만약 로그인이 되지 않았으면 CustomException을 던지지 않고
java.lang.Exception 을 던질 경우
@ExceptionHandler(Exception.class)
을 이용하면 제대로 받습니다.

스프링 설정파일에 ExceptinoHander관련 추가한 부분이 없습니다.

제가 만든 Exception을 ExceptinoHander를 통해 받고싶습니다.
혹시 받을 수 없다면, java.lang.Exception 처럼 받을 수 있는 Exception이
따로있는지 알려주세요.

감사합니다.

(관련 코드는 아래와 같습니다. 총 세개의 파일 중 중요한 부분입니다.)

// Aspect.java
@Aspect
@Component
public class LoginRequiredAspect {
@Before("@annotation(LoginRequired)")
public void loginRequired(JoinPoint joinPoint)
throws LoginRequiredException {
Object[] args = joinPoint.getArgs();
Principal principal = (Principal) args[0];

if (principal == null) {
throw new LoginRequiredException();
}
}
}

// Controller.java
@Controller
public class HelloController {
@LoginRequired
@RequestMapping(value = "/hello", method = RequestMethod.POST)
public String getRounds(Principal principal, Map<String, Object> map) {
String viewname = null;
return viewname;
}
}

// RestResponseEntityExceptionHandler.java
@ControllerAdvice
public class RestResponseEntityExceptionHandler
extends ResponseEntityExceptionHandler {

@ExceptionHandler(LoginRequiredException.class)
public String handleLoginRequiredException(LoginRequiredException ex,
HttpServletRequest request, HttpServletResponse response) {
System.out.println("here!!!");
System.out.println(request.getContextPath());
return Viewname.LOGIN_REQURIED;
}
}

답변

안녕하세요.. 왕상호님..

아마도 ControllerAdvice는 원래의 target이 던진 Exception을 catch하는 부분으로..

다른 before 유형의 advice(aspect)가 던진 exception은 의미가 없을 것 같습니다.

혹.. before아 아닌 around 유형이면.. advice가 처리한 return 및 exception을 직접 받기 때문에 가능할 수도 있을 것 같습니다.

이 부분은 직접 테스트를 해보시면 되실 것 같습니다.

그럼. 즐거운 하루되십시오.
감사합니다.

이 페이지의 구성

묻고 답하기