首页   >   代码编程   >   JAVA开发

记一次dubbo自定义ExceptionFilter踩的坑

前面在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踩的坑

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

雨落无影

QQ群Ⅰ: 686430774 (已满)

QQ群Ⅱ: 718410762

QQ群Ⅲ: 638620451 (已满)

QQ群Ⅳ: 474195684

QQ群Ⅴ: 463034360 (已满)

QQ群Ⅵ: 879266502

QQ群Ⅶ: 627786015 (已满)

工作5分钟,吹逼2小时: 855525339 (娱乐消遣,广告狗勿进)

如果文章有帮到你,可以考虑请博主喝杯咖啡!

分享到:

欢迎分享本文,转载请注明出处!

作者:不忘初心

发布时间:2020-05-13

永久地址:https://www.jiweichengzhu.com/article/806d8057e4e3434283942ec02e086e98

评论