요즘 많이 사용되는 AOP Logging. 현재 작업 중인 프로젝트에서도 사용중인데, 최근 기능을 추가하면서 문제가 발생했다.
● 문제발생
현재 사용중인 프로젝트에서도 AspectLogging 기법을 사용했다. 그런데, class cast를 하는 과정에서 지속적으로
Exception in thread "main" java.lang.ClassCastException: $Proxy11 cannot be cast to classA
라고 하는 문제가 발생하면서 로깅클래스에서 동작이 멈추는 증상이 나타났다. 물론…
AOP측에서 이에 대한 예외처리를 제대로 했으면 별문제가 없었겠지만,
● 문제요인
문제가 발생하는 부분을 유심히 살펴봤다. 스프링의 ReloadableResourceBundleMessageSource를 확장extends하여 간단한 메소드를 추가한 ResourceBundleMessageSource클래스로 class casting을 하는 부분에서 문제가 발생하고 있었다.
● 힌트
이 문제가 왜 생겼는지 인터넷 검색에 들어간다.
그러다가 발견한 힌트!
classcastexception-proxy-cannot-be-cast-to-using-aop - Stackoverflow
제일 마지막 부분에
이 글을 보고 깨달음을 얻었다.
● 해결책
- BundleMessageSource 라고 하는 인터페이스를 만들고, ResourceBundleMessageSource 클래스에서 implements 로 구현한다고 선언.
- ResourceBundleMessageSource 를 class casting 하는 부분을 BundleMessageSource 로 변경하였다.
- OK~!
● 정리
… proxy에서 효과적인 캐스팅 방식은, ‘클래스 캐스팅을 사용할 경우 인터페이스를 선언하여 구현하고 인터페이스로 캐스팅하는 것’ 이다.
'Java > Framework & Libs' 카테고리의 다른 글
SpringFramework 4.0 사용, JsonView MappingJacksonJsonView @Deprecate (0) | 2014.01.21 |
---|---|
Hibernate, fetch=FetchType.LAZY 선언된 필드에서 문제가 생길 경우 (1) | 2014.01.10 |
Spring MVC: @RequestBody + @ResponseBody + JSON + AJAX (2) | 2013.09.16 |
Thymeleaf, 2.0.17 SpringEL expression Exception 발생, 2.0.16 다운그레이드 (0) | 2013.06.27 |
Thymeself, prefix 경로설정 삽질 (1) | 2013.05.24 |