Java @RMI方面

Java @RMI方面,java,spring,Java,Spring,我有一个带有spring配置的应用服务器客户端RMI。现在我不想使用@Aspect添加方法调用日志记录 我在spring-context.xml中添加了: <aop:aspectj-autoproxy> </aop:aspectj-autoproxy> <bean id="loggerAspect" class="my.aspect.LoggerAspect" /> 当我尝试运行我的应用程序时,我得到: Caused by: java.io.NotSeria

我有一个带有spring配置的应用服务器客户端RMI。现在我不想使用@Aspect添加方法调用日志记录

我在spring-context.xml中添加了:

<aop:aspectj-autoproxy>
</aop:aspectj-autoproxy>
<bean id="loggerAspect" class="my.aspect.LoggerAspect" />
当我尝试运行我的应用程序时,我得到:

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

序列化Spring AOP代理很棘手,因为有很多失败点

  • 对于Cglib代理,生成的类在端点JVM中不存在,因此在反序列化时会出现类未找到异常
  • 对于JDK代理,advisor链应该是可序列化的,因此AspectJ样式(您的问题)和XMLAOP命名空间也被丢弃
但是,您仍然可以使用可序列化的advisor链序列化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>


如果所有目标对象都实现了一个接口,就可以工作。

我要补充的是,我的方面记录器在RMI以外的其他类中工作良好,而我的RMI在widouth方面记录器中工作良好,但它们不能一起工作……我将其添加到spring配置中,但我仍然遇到了相同的问题。我还必须改变什么?你能给我一个简单的例子吗?试着在
org.springframework.aop.interceptor.SimpleTraceInterceptor
中禁用loggerspect并将日志级别设置为跟踪以查看跟踪。
<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>