interceptor 에서 컨트롤러의 어노테이션 체크하는 중 ClassCastException 이 발생합니다.
- 작성자 :
- 이*철
- 작성일 :
- 2016-08-14 15:26:24
- 조회수 :
- 1,396
- 구분 :
- 개발환경
- 진행상태 :
- 완료
Q
1. 먼저 어노테이션을 만들었습니다.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NoInterceptor {
}
2. 그 다음 인터셉터에서 무시하길 원하는 "컨트롤러의 특정 메소드"에 어노테이션을 붙였습니다.
@Controller
public class MyController {
@RequestMapping("/my/info")
@NoInterceptor
public ModelAndView myInfo(){
...
}
}
3. 그리고 인터셉터에서 해당 어노테이션을 체크 하려고 하는데
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
NoInterceptor usingAuth = ((HandlerMethod) handler).getMethodAnnotation(NoInterceptor.class);
if(usingAuth != null) {
// 어노테이션이 붙은 메소드에서 넘어온 것이므로 그냥 패스
}
else {
// To-Do
}
}
}
그런데 실행해보면 NoInterceptor usingAuth = ((HandlerMethod) handler).getMethodAnnotation(NoInterceptor.class);
이부분에서 에러가 납니다.
스프링 3.1 버전 이상에서는 인터셉터의 preHandle 메소드의 파라미터인 handler 에 HandlerMethod 가 들어와야 하는데
LoginController 가 들어옵니다.
이렇게 컨트롤러객체가 바로 들어오는 경우는 3.0 이하 버전이라고 알고 있는데요.
지금 사용중인게 전자정부 3.5.1 버전이고, 이 버전은 스프링 4.0.9 버전을 사용중이라고 알고 있는데요,
왜 (인터셉터의 preHandle 메소드의 파라미터인) handler 객체가 HandlerMethod 가 아닌 컨트롤러객체가 들어오는건지요?
버전을 3.2.9로 낮춰도 봤지만 마찬가지입니다.
혹시 현재 버전에서 어노테이션을 이용해서 인터셉터 예외를 설정하는 다른 방법이 있는건지요?
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NoInterceptor {
}
2. 그 다음 인터셉터에서 무시하길 원하는 "컨트롤러의 특정 메소드"에 어노테이션을 붙였습니다.
@Controller
public class MyController {
@RequestMapping("/my/info")
@NoInterceptor
public ModelAndView myInfo(){
...
}
}
3. 그리고 인터셉터에서 해당 어노테이션을 체크 하려고 하는데
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
NoInterceptor usingAuth = ((HandlerMethod) handler).getMethodAnnotation(NoInterceptor.class);
if(usingAuth != null) {
// 어노테이션이 붙은 메소드에서 넘어온 것이므로 그냥 패스
}
else {
// To-Do
}
}
}
그런데 실행해보면 NoInterceptor usingAuth = ((HandlerMethod) handler).getMethodAnnotation(NoInterceptor.class);
이부분에서 에러가 납니다.
스프링 3.1 버전 이상에서는 인터셉터의 preHandle 메소드의 파라미터인 handler 에 HandlerMethod 가 들어와야 하는데
LoginController 가 들어옵니다.
이렇게 컨트롤러객체가 바로 들어오는 경우는 3.0 이하 버전이라고 알고 있는데요.
지금 사용중인게 전자정부 3.5.1 버전이고, 이 버전은 스프링 4.0.9 버전을 사용중이라고 알고 있는데요,
왜 (인터셉터의 preHandle 메소드의 파라미터인) handler 객체가 HandlerMethod 가 아닌 컨트롤러객체가 들어오는건지요?
버전을 3.2.9로 낮춰도 봤지만 마찬가지입니다.
혹시 현재 버전에서 어노테이션을 이용해서 인터셉터 예외를 설정하는 다른 방법이 있는건지요?
A
안녕하세요.
문의하신 내용으로 보아 handerMapping클래스를 어떤걸 쓰셨는지 확인이 필요할 듯 합니다.
spring3.1 이상부터 DefaultAnnotationHandlerMapping클래스는 @depreciated 되고
대신 RequestMappingHandlerMapping 클래스를 사용하며, 이 Mapping 클래스를 통하여
컨트롤러의 메소드 레벨까지 맵핑이 가능합니다.
RequestMappingHandlerMapping클래스 및 설정 방법은 아래 내용을 참고 하시기 바랍니다.
http://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte2:ptl:handlermapping
감사합니다.
문의하신 내용으로 보아 handerMapping클래스를 어떤걸 쓰셨는지 확인이 필요할 듯 합니다.
spring3.1 이상부터 DefaultAnnotationHandlerMapping클래스는 @depreciated 되고
대신 RequestMappingHandlerMapping 클래스를 사용하며, 이 Mapping 클래스를 통하여
컨트롤러의 메소드 레벨까지 맵핑이 가능합니다.
RequestMappingHandlerMapping클래스 및 설정 방법은 아래 내용을 참고 하시기 바랍니다.
http://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte2:ptl:handlermapping
감사합니다.