2014-06-06 3 views
0

스프링 구성의 응용 프로그램 서버 - 클라이언트 RMI가 있습니다. 이제 @Aspect를 사용하여 메서드 호출 로깅을 추가하지 않을 것입니다. @Aspect with RMI

나는 나의 봄-context.xml에 추가 :

<aop:aspectj-autoproxy> 
</aop:aspectj-autoproxy> 
<bean id="loggerAspect" class="my.aspect.LoggerAspect" /> 

loggerAspect

@Pointcut("execution(* my.rmi.service.*.*(..))") 

내가 얻을 내 응용 프로그램을 실행하려고

정의했습니다

Caused by: java.io.NotSerializableException: org.springframework.aop.aspectj.annotation.InstantiationModelAwarePointcutAdvisorImpl 
at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
at java.io.ObjectOutputStream.writeArray(Unknown Source) 
at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) 
at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) 
at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) 
at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
at java.io.ObjectOutputStream.writeObject(Unknown Source) 
... 8 more 

내 RMI 인터페이스는 Serializable를 확장 해,이 인터페이스로 사용되는 모든 클래스도 Serializable를 구현합니다.

+0

RMI가 아닌 다른 클래스에서 내 애스펙트 로거가 올바르게 작동하지만 내 RMI가 벌거숭이 애스펙트 로거를 작동하지만 함께 작동하지 않는다고 추가 하겠지만 ... – Gocha

답변

1

스프링 AOP 프록시를 직렬화하는 것은 많은 실패 지점이 있기 때문에 까다로운 작업입니다.

  • Cglib 프록시의 경우 생성 된 클래스는 엔드 포인트 JVM에 존재하지 않으므로 비 직렬화 할 때 클래스를 찾을 수 없습니다 예외가 발생합니다.
  • JDK 프록시의 경우 권고 자 체인이 직렬 가능해야하므로 AspectJ 스타일 (문제점) 및 xml aop 이름 공간도 폐기됩니다.

그러나 여전히 직렬화 가능 권고 자 체인을 사용하여 JDK 프록시를 직렬화 할 수 있습니다. 모든 대상 오브젝트의 인터페이스를 구현하는 경우 일 것이다 AspectJExpressionPointcutAdvisor

<bean id="advisor" class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor"> 
    <property name="expression" value="execution (* test.*.*(..))" /> 
    <property name="advice"> 
     <bean class="org.springframework.aop.interceptor.SimpleTraceInterceptor" /> 
    </property> 
</bean> 

등을 사용

.

+0

내 스프링 구성에 이것을 추가했지만 여전히 동일하게 유지됩니다. 문제. 그 밖의 무엇을 바꾸어야합니까? 간단한 예를 들어 주시겠습니까? – Gocha

+0

트레이스를 보려면 LoggerAspect를 비활성화하고 org.springframework.aop.interceptor.SimpleTraceInterceptor에서 로그 수준을 TRACE로 설정해보십시오. –

+0

모든 것이 지금 작동 중입니다. 감사합니다! – Gocha