@Aspect与RMI

时间:2014-06-06 17:36:39

标签: java spring

我有一个带弹簧配置的应用服务器 - 客户端RMI。现在我不会使用@Aspect添加方法调用记录。

我在spring-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。

1 个答案:

答案 0 :(得分:1)

序列化Spring 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>
如果所有目标对象都实现了接口,则

将起作用。