ExceptionHandler
- 작성자 :
- 왕*호
- 작성일 :
- 2013-04-25 10:00:13
- 조회수 :
- 1,670
- 구분 :
- 기타
- 진행상태 :
- 완료
Q
스프링 버전: 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;
}
}
질문:
@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;
}
}
A
안녕하세요.. 왕상호님..
아마도 ControllerAdvice는 원래의 target이 던진 Exception을 catch하는 부분으로..
다른 before 유형의 advice(aspect)가 던진 exception은 의미가 없을 것 같습니다.
혹.. before아 아닌 around 유형이면.. advice가 처리한 return 및 exception을 직접 받기 때문에 가능할 수도 있을 것 같습니다.
이 부분은 직접 테스트를 해보시면 되실 것 같습니다.
그럼. 즐거운 하루되십시오.
감사합니다.
아마도 ControllerAdvice는 원래의 target이 던진 Exception을 catch하는 부분으로..
다른 before 유형의 advice(aspect)가 던진 exception은 의미가 없을 것 같습니다.
혹.. before아 아닌 around 유형이면.. advice가 처리한 return 및 exception을 직접 받기 때문에 가능할 수도 있을 것 같습니다.
이 부분은 직접 테스트를 해보시면 되실 것 같습니다.
그럼. 즐거운 하루되십시오.
감사합니다.