Spring 正在尝试在存在 aop 时子类化记录组件

Spring is trying to subclass a record component when aop is present

我有一个 spring 引导应用程序,我在其中使用了方面。最近,我尝试将我的 @ConfigurationProperties 类 记录转换为 java 记录,但失败并显示 "Cannot subclass final class {..}Properties"。似乎 spring 正在尝试为我的记录制作 cglib 代理,这显然失败了。有什么办法可以告诉 spring 不要为特定的 类 创建代理吗?

编辑:

属性:

@ConfigurationProperties(prefix = "foo.bar")
public record MyProperties(String a,
                           String b) {

}

堆栈跟踪:

Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class {...}.MyProperties: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class {...}.MyProperties
at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:209)
at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:110)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:478)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:342)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:291)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:437)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1790)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:602)
... 48 common frames omitted
Caused by: java.lang.IllegalArgumentException: Cannot subclass final class {...}.MyProperties
at org.springframework.cglib.proxy.Enhancer.generateClass(Enhancer.java:660)
at org.springframework.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at org.springframework.cglib.core.ClassLoaderAwareGeneratorStrategy.generate(ClassLoaderAwareGeneratorStrategy.java:57)
at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:358)
at org.springframework.cglib.proxy.Enhancer.generate(Enhancer.java:585)
at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:131)
at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:319)
at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:572)
at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:419)
at org.springframework.aop.framework.ObjenesisCglibAopProxy.createProxyClassAndInstance(ObjenesisCglibAopProxy.java:57)
at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:206)
... 55 common frames omitted

编辑 2:一个最小的、可重现的例子:https://github.com/moxaj/aspect-mcve-2

我克隆了您的 MCVE 存储库。谢谢,很有帮助。

请注意,Java 条记录隐式为最终记录。因此,Spring AOP 无法将它们子类化以创建动态代理。

你需要改变

@Pointcut("within(foo.bar..*) @target(org.springframework.stereotype.Service)")

(请同时注意语法错误,缺少&&)到

@Pointcut(
  "within(foo.bar..*) && " +
  "@target(org.springframework.stereotype.Service) && " +
  "!@within(org.springframework.boot.context.properties.ConfigurationProperties)"
)

我只是添加了几个换行符以使切入点更具可读性。