1

我们正在使用 GigaSpaces 版本 8.0.0(是的,它很旧)和 Spring 3(是的,它也很旧)。有两个模块 A 和 B。A 是“主”模块,负责读写空间并暴露一些远程服务。A 和 B 分别运行。B 创建一个实体的实例,该实例具有一个类对象的字段。这个类只存在于B;A 对此一无所知。然后它对 A 进行远程调用,最终将实例写入空间。

稍后,A 加载此实体并通过执行创建远程类的实例entity.getClassObject().newInstance()。即使此类在 A 的运行时类加载器中不存在,这仍然有效,因为此类的类加载器是 GigaSpaces 附带的 LRMI(轻远程方法调用)类加载器。我想它知道如何实例化它。

当我们向 A 添加一个方面时,问题就出现了。我们现有的代码使用 A 的应用程序上下文自动装配远程类的实例,并使用initializeBean. 在我们添加方面之前,自动装配和初始化工作正常。现在,在初始化期间,它会尝试查看方面中的建议是否适用于正在初始化的 bean。作为此过程的一部分,它尝试使用Class.forNamebean 的类名来创建类的实例。这导致一个ClassNotFoundException因为该类显然不存在于运行时类加载器中。所以 AspectJ 将类型解析为MissingResolvedTypeWithKnownSignature而不是立即失败。但最终当 AspectJ 尝试查找该类的超类时会失败,因为它没有该信息,并抛出以下异常:

org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException: warning can't determine implemented interfaces of missing type com.mypackage.MyRemoteClass
 [Xlint:cantFindType]
        at org.aspectj.weaver.reflect.ReflectionWorld$ExceptionBasedMessageHandler.handleMessage(ReflectionWorld.java:129)
        at org.aspectj.weaver.Lint$Kind.signal(Lint.java:328)
        at org.aspectj.weaver.MissingResolvedTypeWithKnownSignature.raiseCantFindType(MissingResolvedTypeWithKnownSignature.java:232)
        at org.aspectj.weaver.MissingResolvedTypeWithKnownSignature.getDeclaredInterfaces(MissingResolvedTypeWithKnownSignature.java:86)
        at org.aspectj.weaver.ResolvedType.getDirectSupertypes(ResolvedType.java:82)
        at org.aspectj.weaver.patterns.TypePattern.matchesSubtypes(TypePattern.java:178)
        at org.aspectj.weaver.patterns.ExactTypePattern.matchesSubtypes(ExactTypePattern.java:74)
        at org.aspectj.weaver.patterns.TypePattern.matchesStatically(TypePattern.java:130)
        at org.aspectj.weaver.patterns.KindedPointcut.fastMatch(KindedPointcut.java:141)
        at org.aspectj.weaver.internal.tools.PointcutExpressionImpl.couldMatchJoinPointsInType(PointcutExpressionImpl.java:84)
        at org.springframework.aop.aspectj.AspectJExpressionPointcut.matches(AspectJExpressionPointcut.java:238)
        at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:200)
        at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:254)
        at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:286)
        at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply(AbstractAdvisorAutoProxyCreator.java:117)
        at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:87)
        at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:68)
        at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:359)
        at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:322)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:407)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1426)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:386)
...

有没有办法解决?我可以想到两种方法,但我不确定如何去做。一种是以某种方式阻止 Spring 检查切面是否适用,另一种可能是如果在运行时类加载器中找不到类,则将运行时类加载器替换为委托给 LRMI 类加载器的类加载器。但我不确定我是否能获得 LRMI 类加载器的实例。

有没有人遇到过这种问题?

4

1 回答 1

1

这是我使用的 AspectJ 版本 (1.6.12) 中的一个已知问题。它似乎已在以后的版本中得到修复——至少从 1.8.14 开始(这是我将它升级到的)。所以升级我的 AspectJ 版本解决了这个问题。

于 2020-02-20T00:46:22.943 回答