官方的参数校验方法
https://cn.dubbo.apache.org/zh-cn/docs/advanced/parameter-validation/
目标:能把参数校验异常、自定义异常转化为自定义的response结构。
目标A:增加统一异常处理:
Dubbo自定义异常全局统一处理_还不快去敲代码啊的博客-CSDN博客_dubbo异常统一处理
可以把Fitler文件中定义的加入到<dubbo:provider filter="xxx"> 也可以直接用@Active
这样之后发现普通的抛出异常可以catch,但是参数校验的异常直接catch不到,原因大概是默认的参数校验filter在异常处理filter之前就返回了。
目标B:为了能把异常统一转化为response:
第一种方案:直接实现一个参数校验filter,在其中转换为response
Dubbo服务如何优雅的校验参数_51CTO博客_dubbo指定服务提供者
第二种方案:把官方的全局异常处理放到最前面
https://www.cnblogs.com/mumuxinfei/p/9231310.html
存在的问题有:
1)自定义异常会在dubbo自带的ExceptionFIlter中被转成runtimeException,见
https://blog.csdn.net/zidongxiangxi/article/details/108098173
2)validation异常会包在rpcException里面,见官方实例
因此只能采用方案一:自定义exceptionFilter取代自带的异常处理,也可以在dubbo自带的基础上增加转换response的逻辑
Dubbo Filter 过滤器 —— 自定义异常过滤器(ExceptionFilter)_zhibo_lv的博客-CSDN博客_dubbo 异常filter
网上还看到自定义的fitler可以覆盖自带filter ,但是实测有问题:会走到ExtensionLoader的判重逻辑里面,报
Duplicate extension
dubbo 提供者覆盖Filter或者拓展。_一枚软的硬币的博客-CSDN博客_org.apache.dubbo.rpc.filter文件覆盖问题
参考阅读 使用dubbofiler实现日志调用链追踪
基于dubbo的filter过滤器实现微服务日志追踪,以及实现原理_LxyrichBos的博客-CSDN博客_微服务filter
附:filter加载过程
1)ExtensionLoader.loadExtensionClasses
loadFile(extensionClasses, DUBBO_INTERNAL_DIRECTORY);
loadFile(extensionClasses, DUBBO_DIRECTORY);
loadFile(extensionClasses, SERVICES_DIRECTORY);
会读读取各个jar包和代码中的META-INF
先读内部的,再读外部的。最候用filter文件中的key value,放进
2)在getActivateExtension中,对每个接口去组装filter链