Skip to content

Exception occurred when proxying class loaded via custom ClassLoader #35054

Closed as not planned
@leeovo1102

Description

@leeovo1102

Exception

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'Plugin#UserServiceImpl': Could not generate CGLIB subclass of class test250410.service.impl.UserServiceImpl: Common causes of this problem include using a final class or a non-visible class	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:607)	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522)	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337)	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335)	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)	at com.allstar.dev.SpringTest.test01(SpringTest.java:362) Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class test250410.service.impl.UserServiceImpl: Common causes of this problem include using a final class or a non-visible class	at org.springframework.aop.framework.CglibAopProxy.buildProxy(CglibAopProxy.java:230)	at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:163)	at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:110)	at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.buildProxy(AbstractAutoProxyCreator.java:519)	at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:466)	at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:371)	at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:320)	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:438) Caused by: org.springframework.cglib.core.CodeGenerationException: java.lang.ClassNotFoundException-->test250410.service.impl.UserServiceImpl$$SpringCGLIB$$0	at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:380)	at org.springframework.cglib.proxy.Enhancer.generate(Enhancer.java:575)	at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.lambda$new$1(AbstractClassGenerator.java:107)	at org.springframework.cglib.core.internal.LoadingCache.lambda$createEntry$1(LoadingCache.java:52)	at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317)	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)	at --- Async.Stack.Trace --- (captured by IntelliJ IDEA debugger) Caused by: java.lang.ClassNotFoundException: test250410.service.impl.UserServiceImpl$$SpringCGLIB$$0	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)	at java.base/java.lang.Class.forName0(Native Method)	at java.base/java.lang.Class.forName(Class.java:534)	at java.base/java.lang.Class.forName(Class.java:513)	at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:559)	at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:371) 

Code

The UserServiceImpl class in the jar:

@Service public class UserServiceImpl extends ServiceImpl<UserMapper, UserEntity> implements UserService { @Transactional(rollbackFor = Exception.class) public List<UserEntity> test(String username) { System.out.println(DbOperation.getCurrentConnection()); return lambdaQuery().eq(!StringUtils.isBlank(username), UserEntity::getUsername, username) .list(); } }

Another Spring Boot program:

URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{ file.toURI().toURL() }, SpringBootApplication.class.getClassLoader()); Class<?> componentClass = urlClassLoader.loadClass(xxx); BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(componentClass); beanDefinitionBuilder.setScope(BeanDefinition.SCOPE_SINGLETON); beanDefinitionBuilder.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE); BeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition(); // beanDefinition.setSynthetic(true); defaultListableBeanFactory.registerBeanDefinition(componentName, beanDefinition); // Exception occurred while getting Bean defaultListableBeanFactory.getBean(componentName);

Place of investigation:

org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator:515

private Object buildProxy(Class<?> beanClass, @Nullable String beanName, @Nullable Object[] specificInterceptors, TargetSource targetSource, boolean classOnly) { // ... ClassLoader classLoader = getProxyClassLoader(); if (classLoader instanceof SmartClassLoader smartClassLoader && classLoader != beanClass.getClassLoader()) { classLoader = smartClassLoader.getOriginalClassLoader(); } return (classOnly ? proxyFactory.getProxyClass(classLoader) : proxyFactory.getProxy(classLoader)); }

ClassLoader classLoader = getProxyClassLoader();

I obtained the ClassLoader for AppClassLoader instead of beanClass. I would like to ask about its usage here.

Metadata

Metadata

Assignees

Labels

in: coreIssues in core modules (aop, beans, core, context, expression)status: invalidAn issue that we don't feel is valid

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions