```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 
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to