You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@dubbo.apache.org by "zhuliangcai (GitHub)" <gi...@apache.org> on 2019/12/24 13:04:02 UTC
[GitHub] [dubbo] zhuliangcai commented on issue #5522: dubbo 注册中心没有加protocol会失败,并且报错有问题
```java
org.apache.dubbo.registry.integration.AbstractConfiguratorListener#initWith
protected final void initWith(String key) {
DynamicConfiguration dynamicConfiguration = DynamicConfiguration.getDynamicConfiguration();
dynamicConfiguration.addListener(key, this);
String rawConfig = dynamicConfiguration.getRule(key, DynamicConfiguration.DEFAULT_GROUP);
if (!StringUtils.isEmpty(rawConfig)) {
genConfiguratorsFromRawRule(rawConfig);
}
}
org.apache.dubbo.configcenter.DynamicConfiguration#getDynamicConfiguration
static DynamicConfiguration getDynamicConfiguration() {
Optional<Configuration> optional = Environment.getInstance().getDynamicConfiguration();
return (DynamicConfiguration) optional.orElseGet(() -> getExtensionLoader(DynamicConfigurationFactory.class)
.getDefaultExtension()
.getDynamicConfiguration(null));
}
```
在方法配置registry 时,没有协议名称就不会在 Environment.getInstance()中添加DynamicConfiguration,从而在上述的initWith方法中调用了获取getDynamicConfiguration的方法,由于获取不到对象,不得不执行lambda表达式中的获取方式,主要问题在此处传递了null,经测试此处必然报空指针异常,从源码中也能看出异常来自org.apache.dubbo.configcenter.support.zookeeper.ZookeeperDynamicConfiguration#ZookeeperDynamicConfiguration构造方法中根据url获取参数。
这里之所以会报错主要原因在于下面的类被修改了
```java
//@SPI("nop")
@SPI("zookeeper")
public interface DynamicConfigurationFactory {
DynamicConfiguration getDynamicConfiguration(URL url);
}
```
默认值改为了 zookeeper ,而 nop对应的类NopDynamicConfiguration在构造是不会报错的
[ Full content available at: https://github.com/apache/dubbo/issues/5522 ]
This message was relayed via gitbox.apache.org for notifications@dubbo.apache.org