您现在的位置是:网站首页 > 代码编程 > JAVA开发JAVA开发

【原】记一次dubbo自定义ExceptionFilter踩的坑

不忘初心 不忘初心 2020-05-13 围观() 评论() 点赞() JAVA开发

简介:前面在Dubbo自定义ExceptionFilter实现业务异常透传一文中,提到了一个点,自定义的ExceptionFilter 不是spring的bean,从而需要在 /META-INF/dubbo/com.alibaba.dubbo.rpc.Filter 文件中配置一下,不然在dubbo配置中引入不了,现在回顾一下,还是蛮简单的,并不需要一些复杂繁琐的操作,但是我当时就在这里踩了一个idea工具的大坑,不过归根究底还是自己对工具不熟悉,特写此文来记录一下。

前面在Dubbo自定义ExceptionFilter实现业务异常透传一文中,提到了一个点,自定义的ExceptionFilter 不是spring的bean,从而需要在 /META-INF/dubbo/com.alibaba.dubbo.rpc.Filter 文件中配置一下,不然在dubbo配置中引入不了,现在回顾一下,还是蛮简单的,并不需要一些复杂繁琐的操作,但是我当时就在这里踩了一个idea工具的大坑,不过归根究底还是自己对工具不熟悉,特写此文来记录一下。

在我配置完成filter之后,启动项目立马就报错:

java.lang.IllegalStateException: No such extension org.apache.dubbo.rpc.Filter by name dubboExceptionFilter
	at org.apache.dubbo.common.extension.ExtensionLoader.findException(ExtensionLoader.java:584)
	at org.apache.dubbo.common.extension.ExtensionLoader.createExtension(ExtensionLoader.java:591)
	at org.apache.dubbo.common.extension.ExtensionLoader.getExtension(ExtensionLoader.java:392)
	at org.apache.dubbo.common.extension.ExtensionLoader.getActivateExtension(ExtensionLoader.java:267)
	at org.apache.dubbo.common.extension.ExtensionLoader.getActivateExtension(ExtensionLoader.java:215)
	at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper.buildInvokerChain(ProtocolFilterWrapper.java:54)
	at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper.export(ProtocolFilterWrapper.java:145)
	at org.apache.dubbo.qos.protocol.QosProtocolWrapper.export(QosProtocolWrapper.java:66)
	at org.apache.dubbo.rpc.Protocol$Adaptive.export(Protocol$Adaptive.java)
	at org.apache.dubbo.config.ServiceConfig.exportLocal(ServiceConfig.java:506)
	at org.apache.dubbo.config.ServiceConfig.doExportUrlsFor1Protocol(ServiceConfig.java:438)
	at org.apache.dubbo.config.ServiceConfig.doExportUrls(ServiceConfig.java:315)
	at org.apache.dubbo.config.ServiceConfig.doExport(ServiceConfig.java:287)
	at org.apache.dubbo.config.ServiceConfig.export(ServiceConfig.java:205)
	at org.apache.dubbo.config.bootstrap.DubboBootstrap.lambda$exportServices$13(DubboBootstrap.java:873)
	at java.util.HashMap$Values.forEach(HashMap.java:981)
	at org.apache.dubbo.config.bootstrap.DubboBootstrap.exportServices(DubboBootstrap.java:861)
	at org.apache.dubbo.config.bootstrap.DubboBootstrap.start(DubboBootstrap.java:703)
	at org.apache.dubbo.config.spring.context.DubboBootstrapApplicationListener.onContextRefreshedEvent(DubboBootstrapApplicationListener.java:52)
	at org.apache.dubbo.config.spring.context.DubboBootstrapApplicationListener.onApplicationContextEvent(DubboBootstrapApplicationListener.java:45)
	at org.apache.dubbo.config.spring.context.OneTimeExecutionApplicationContextEventListener.onApplicationEvent(OneTimeExecutionApplicationContextEventListener.java:40)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:403)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:360)
	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:897)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:553)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
	at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:140)
	at com.zhiri.biz.center.application.BizCenterApplication.main(BizCenterApplication.java:17)

错误提示信息很明确,就是找不到我在dubbo中配置的那个filter,但是我都一一检查了,确实没有配置出错的地方,百度了一圈,发现也都是和我一样的配置,并没有什么不一样。

就当我快要放弃,准备使用如何在dubbo中捕获并处理自定义业务异常一文中提到的第二种方法时,我突然注意到我修改了文件之后,target目录中的文件名没有变更过来,所以我就去文件夹中看了一下,竟然发现我的文件夹目录层级不对,瞬间反应过来问题就出在这里了。。。

那为什么我会出现这个低级错误呢?

在idea中,提供了两种文件夹,一种叫package,一种叫directory,这二者有啥区别呢?

别的没有深究,就涉及到我出这个问题的点说一下:

新建package的时候,可以写多级目录命名,a.b.c就会生成a、b、c三个文件夹,而且还是有层级关系的;

新建directory的时候,命名依旧可以随便写,但是,这里不会帮你自动拆分文件夹,也就是说无法生成层级关系;

重点来了

写到这里,可能有人已经反应过来了,没错,问题就出在这里,我在新建 /META-INF/dubbo 目录的时候,new的是directory,但是我在命名上直接写的是META-INF.dubbo,所以最终的文件夹只有一层,导致加载的时候一直找不到文件。。。

记一次dubbo自定义ExceptionFilter踩的坑

再次询问,为什么我要这么写呢?

这个并非是我偷懒和想当然,因为在idea中,它提供了一个合并文件夹展示的功能(很香),可以将空文件夹合并起来展示,这样就不会导致每次找个文件时往下点半天。

如下图:

记一次dubbo自定义ExceptionFilter踩的坑

没成想,就是这个目录展示结构把我给忽悠住了,一开始我压根都没往目录层级上想。。。

dubbo分布式

看完文章,有任何疑问,请加入群聊一起交流!!!

很赞哦! ()

文章评论

  • 请先说点什么
    人参与,条评论

请使用电脑浏览器访问本页面,使用手机浏览器访问本页面会导致下载文件异常!!!

雨落无影

关注上方公众号,回复关键字【下载】获取下载码

用完即删,每次下载需重新获取下载码

若出现下载不了的情况,请及时联系站长进行解决

站点信息

  • 网站程序:spring + freemarker
  • 主题模板:《今夕何夕》
  • 文章统计:篇文章
  • 标签管理标签云
  • 微信公众号:扫描二维码,关注我们