gpt4 book ai didi

java - @Aspect 与 RMI

转载 作者:行者123 更新时间:2023-12-01 12:52:55 28 4
gpt4 key购买 nike

我有一个带有 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 接口(interface)扩展了 Serializable,并且此接口(interface)中使用的所有类也实现了 Serializable。

最佳答案

序列化 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>

如果所有目标对象都实现一个接口(interface),则将起作用。

关于java - @Aspect 与 RMI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24087654/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com