Spring MVC 사용 시 SimpleMappingExceptionResolver 설정을 해놓았다. Controller 에서 공통으로 필요한 부분을 AOP 로 만들어서 사용 하는대, Exception 발생 시 AOP Proxy 에서 예외가 발생 했다. 정작 필요한 에러 메시지는 볼 수 없었다.
일반적으로 AOP 설정을 하는 경우 아래와 같이 선언을 했었다.
<aop:config>
// Doing...
</aop:config>
<aop:config>
에 아무런 설정 값을 주지 않은 경우 기본적으로 JDK Proxy 로 동작 한다. Spring 에서 제공 하는 InvocableHandlerMethod.invoke(Object[] arg) 메소드를 사용 하여 실제 targetClass를 호출 한다. Java Reflection 기반 이라고 생각 하면 된다.
에러 메시지의 일부 이다. invoke 호출 시 예외가 발생 한다. targetClass 가 Interface 를 구현하고 있는 경우 instance 를 인식하지 못해 예외가 발생 하는 것 같다.
java.lang.IllegalStateException: The mapped controller method class 'com.xxx.xxx' is not an instance of the actual controller bean instance '$Proxy22'. If the controller requires proxying (e.g. due to @Transactional), please use class-based proxying.
HandlerMethod details:
Controller [$Proxy22]
Method [public org.springframework.web.servlet.ModelAndView com.xxx.xxx.xxxxxx() throws java.lang.Exception]
// 생략...
문제 해결을 위해서는 Class 기반 proxy 사용을 해야 한다.
please use class-based proxying.
이 메시지가 친절하게 방법을 알려 준다.
CGLIB Proxy 를 사용하려면 아래와 같이 설정 값을 변경 한다.
<aop:config proxy-target-class="true">
// Doing...
</aop:config>
테스트를 해보자. 정상적으로 동작 할 것 이다.
참고 사이트