升级dubbo2.7.15版本报找不到JSONValidator问题处理
现象:
由于安全漏洞,升级dubbo 2.7.15版本时,报找不到com/alibaba/fastjson/JSONValidator,导致某个服务无法启动,但有些服务确实正常启动。
具体错误信息如下:
Caused by: java.lang.NoClassDefFoundError: com/alibaba/fastjson/JSONValidator at org.apache.dubbo.rpc.cluster.configurator.parser.ConfigParser.isJsonArray(ConfigParser.java:221) ~[dubbo-2.7.15.jar:2.7.15] at org.apache.dubbo.rpc.cluster.configurator.parser.ConfigParser.parseConfigurators(ConfigParser.java:47) ~[dubbo-2.7.15.jar:2.7.15] at org.apache.dubbo.registry.integration.AbstractConfiguratorListener.genConfiguratorsFromRawRule(AbstractConfiguratorListener.java:78) ~[dubbo-2.7.15.jar:2.7.15] at org.apache.dubbo.registry.integration.AbstractConfiguratorListener.initWith(AbstractConfiguratorListener.java:48) ~[dubbo-2.7.15.jar:2.7.15] at org.apache.dubbo.registry.integration.RegistryProtocol$ProviderConfigurationListener.<init>(RegistryProtocol.java:753) ~[dubbo-2.7.15.jar:2.7.15] at org.apache.dubbo.registry.integration.RegistryProtocol.<init>(RegistryProtocol.java:142) ~[dubbo-2.7.15.jar:2.7.15] at org.apache.dubbo.registry.integration.InterfaceCompatibleRegistryProtocol.<init>(InterfaceCompatibleRegistryProtocol.java:38) ~[dubbo-2.7.15.jar:2.7.15] at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_251] at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:1.8.0_251] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_251] at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_251] at org.apache.dubbo.common.extension.ExtensionLoader.createExtension(ExtensionLoader.java:661) ~[dubbo-2.7.15.jar:2.7.15]
原因
经过跟踪代码调试,发现问题的关键。
(1)在AbstractConfiguratorListener初始化治理信息时,会调dubbo-admin中治理信息;
(2)如果存在治理规则,会调ConfigParser.isJsonArray方法判断规则是否为JSONArray,其中使用的fastjson的JSONValidator。
(3)而我们的parent-pom排除了fastjson,所以会报错,导致应用无法启动。
(4)2.7.15版本对代码做了升级,如下:
![](https://img2022.cnblogs.com/blog/1012728/202205/1012728-20220525104924419-1947593214.png)
为什么其他服务启动成功了呢?
原因是,我们这个服务之前由于内部测试,在admin中增加了权重规则。
在应用启动,从ZK中读取/dubbo/config/dubbo/loan-user-account.configurators时,获取到了值,如下
configs: - addresses: - ******* enabled: true parameters: weight: 0 side: provider type: weight enabled: false key: ******* scope: application
将规则删除前后,ZK数据变化如下:
![](https://img2022.cnblogs.com/blog/1012728/202205/1012728-20220525105846547-1659374155.png)
然后服务启动成功,这也是为什么其他服务升级没问题,这个服务升级出现问题的原因。
最后的解决办法
方法一:删除admin中的配置,但admin后续使用需要注意,可能应用会起不来。
方法二:增加JSONValidator的门面,替代fastjson。
出现问题不可怕,关键是具备势必解决问题的心态和方法。--- me
这是水木竹水的博客