Closed as not planned
Description
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.