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