dubbox icon indicating copy to clipboard operation
dubbox copied to clipboard

dubbo集成到spring-boot,使用spring-boot-devtools时创建rest服务异常

Open d2h57 opened this issue 8 years ago • 9 comments

dubbo集成到spring-boot,开发模式下使用了spring-boot-devtools,在创建rest服务时,出现异常,堆栈如下: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userServiceImpl' defined in file [F:\code\newyan-api-server\bin\com\newsmy\newyan\service\impl\UserServiceImpl.class]: Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: interface com.newsmy.newyan.service.UserService is not visible from class loader at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:776) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:369) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:313) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] at com.newsmy.newyan.Application.main(Application.java:14) [bin/:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_72] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_72] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_72] at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_72] at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-1.4.0.RELEASE.jar:1.4.0.RELEASE] Caused by: java.lang.IllegalArgumentException: interface com.newsmy.newyan.service.UserService is not visible from class loader at com.alibaba.dubbo.common.bytecode.Proxy.getProxy(Proxy.java:98) ~[dubbo-common-2.8.4.jar:2.8.4] at com.alibaba.dubbo.common.bytecode.Proxy.getProxy(Proxy.java:67) ~[dubbo-common-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory.getProxy(JavassistProxyFactory.java:35) ~[dubbo-rpc-api-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.proxy.AbstractProxyFactory.getProxy(AbstractProxyFactory.java:49) ~[dubbo-rpc-api-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.proxy.wrapper.StubProxyFactoryWrapper.getProxy(StubProxyFactoryWrapper.java:60) ~[dubbo-rpc-api-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.ProxyFactory$Adpative.getProxy(ProxyFactory$Adpative.java) ~[dubbo-common-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.protocol.AbstractProxyProtocol.export(AbstractProxyProtocol.java:69) ~[dubbo-rpc-api-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.protocol.ProtocolListenerWrapper.export(ProtocolListenerWrapper.java:56) ~[dubbo-rpc-api-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper.export(ProtocolFilterWrapper.java:55) ~[dubbo-rpc-api-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.Protocol$Adpative.export(Protocol$Adpative.java) ~[dubbo-common-2.8.4.jar:2.8.4] at com.alibaba.dubbo.registry.integration.RegistryProtocol.doLocalExport(RegistryProtocol.java:153) ~[dubbo-2.8.4.jar:2.8.4] at com.alibaba.dubbo.registry.integration.RegistryProtocol.export(RegistryProtocol.java:107) ~[dubbo-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.protocol.ProtocolListenerWrapper.export(ProtocolListenerWrapper.java:54) ~[dubbo-rpc-api-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper.export(ProtocolFilterWrapper.java:53) ~[dubbo-rpc-api-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.Protocol$Adpative.export(Protocol$Adpative.java) ~[dubbo-common-2.8.4.jar:2.8.4] at com.alibaba.dubbo.config.ServiceConfig.doExportUrlsFor1Protocol(ServiceConfig.java:489) ~[dubbo-2.8.4.jar:2.8.4] at com.alibaba.dubbo.config.ServiceConfig.doExportUrls(ServiceConfig.java:285) ~[dubbo-2.8.4.jar:2.8.4] at com.alibaba.dubbo.config.ServiceConfig.doExport(ServiceConfig.java:246) ~[dubbo-2.8.4.jar:2.8.4] at com.alibaba.dubbo.config.ServiceConfig.export(ServiceConfig.java:145) ~[dubbo-2.8.4.jar:2.8.4] at com.alibaba.dubbo.config.spring.AnnotationBean.postProcessAfterInitialization(AnnotationBean.java:202) ~[dubbo-2.8.4.jar:2.8.4] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:422) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1583) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] ... 17 more

我查了下问题原因是采用spring-boot-devtools会存在两个classloader,一个是应用类加载器AppClassLoader,一个RestartClassLoader,AppClassLoader用于加载第三方jar,而RestartClassLoader用于加载用户目录下的class。使用rest协议时,会为每个service创建代理类,com.alibaba.dubbo.common.bytecode.Proxy创建代理类时,是用proxy所在classloader为AppClassLoader,去加载用户目录下的class,自然就会报class不可见。

针对这个问题,不知开发组是否可以修改下,谢谢!

d2h57 avatar Oct 28 '16 06:10 d2h57

提议非常好、你有什么好的方案可以直接提出来。哈哈

zhangyq1011 avatar Oct 28 '16 06:10 zhangyq1011

去掉devtools的依赖

huayaoyue6 avatar Oct 31 '16 01:10 huayaoyue6

很好!多谢楼上回复。

zhangyq1011 avatar Oct 31 '16 01:10 zhangyq1011

简单地去掉devtools依赖,只是回避了问题。devtools在开发阶段是非常有价值、高效的,任何修改可以立即生效。我修改了com.alibaba.dubbo.common.bytecode.Proxy.getProxy()方法, 由 public static Proxy getProxy(Class>... ics) { return getProxy(ClassHelper.getCallerClassLoader(Proxy.class), ics); } 改成: public static Proxy getProxy(Class>[] ics) { return getProxy(Thread.currentThread().getContextClassLoader(), ics); } 我测试了下使用rest协议,添加devtool依赖与否,service也是可以正常创建。其它场景则没有验证过。

d2h57 avatar Oct 31 '16 04:10 d2h57

@d2h57 支持一下!修改com.alibaba.dubbo.common.bytecode.Proxy.getProxy()方法感觉有点大了。哈哈

zhangyq1011 avatar Oct 31 '16 04:10 zhangyq1011

在项目里 resources\META-INF\spring-devtools.properties 里添加

restart.include.dubbo=/dubbo-[\\d\\.]+\\.jar

FalconIA avatar Dec 01 '16 03:12 FalconIA

@d2h57 修改代码后是不会报错了,但是修改配置后restart后端口不会被释放掉

VectorHo avatar Dec 16 '16 05:12 VectorHo

厉害了我的哥

hylexus avatar Mar 16 '17 08:03 hylexus

两个maven模块,a模块依赖b模块,在a模块中,使用main方式启动,爆 xx is not visible from class loader, 解决办法在a模块中新建META-INF/spring-devtools.properties,文件中定义restart.exclude.dependency=/b/target/classes/,这样restart class loader不再加载b中的类,这个类,只有appclassloader加载,就不会出现异常了。

AdeGitHub avatar Apr 26 '17 12:04 AdeGitHub