When configure dubbo service or reference bean by xml, the placeholder will not 
be replaced by user defined properties. if registry configuration not 
configured by `dubbo.registries.<registry id>` or has no default service 
registry configuration, it will throw an exception:
```java
Caused by: java.lang.IllegalStateException: No registry config found or it's 
not a valid config! The registry config is: <dubbo:registry valid="false" 
id="registry2" prefix="dubbo.registries." />
        at 
org.apache.dubbo.config.AbstractInterfaceConfig.checkRegistry(AbstractInterfaceConfig.java:177)
        at 
org.apache.dubbo.config.ReferenceConfig.createProxy(ReferenceConfig.java:306)
        at 
org.apache.dubbo.config.ReferenceConfig.init(ReferenceConfig.java:266)
        at org.apache.dubbo.config.ReferenceConfig.get(ReferenceConfig.java:151)
        at 
org.apache.dubbo.config.spring.ReferenceBean.getObject(ReferenceBean.java:68)
        at 
org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:171)
        ... 88 more
````

If we have default registry configuration (`dubbo.registry.xxx`), the reference 
bean defined in xml will using the default registry config even though we have 
configured registry in xml. if there is no default resgitry config, but 
configured by `dubbo.registries.<registry id>`,reference bean will using 
registry config defined by `dubbo.registries` if registry id was the same.

In both cases,the registry config defined in xml are not going to work and 
ignored by dubbo.

Following configuration can reporduce these exception described above.

- Dubbo: 2.7.5
- Dubbo Spring Boot : 2.7.5
- Spring Boot : 2.2.2.RELEASE

### case 1
This configuration will cause `No registry config found or it's not a valid 
config`.

`application.properties`

```ini
dubbo.application.id=demo
dubbo.application.name=demo

# true or false has no effect
#dubbo.config.multiple=true

dubbo.registries.registry1.id=registry1
dubbo.registries.registry1.address=zookeeper://localhost:2181
dubbo.registries.registry1.file=/Users/test/dubbo/registry/registry1

# this configuration is not working
dubbo.demo.registry=zookeeper://localhost:2181
dubbo.registry.file.path=/Users/test/dubbo/registry/registry2
```

`biz-consumer.xml`

```xml
    <dubbo:registry id="registry2" address="${dubbo.demo.registry}" 
file="${dubbo.registry.file.path}" protocol="dubbo" version="1.0.0"/>
    <dubbo:reference id="demoService2" registry="registry2" 
interface="io.test.dubbo.demo.api.DemoService" protocol="dubbo" version="1.0.0" 
check="false"/>
    <bean id="barService" 
class="io.test.dubbo.demo.consumer.client.BarServiceImpl">
        <property name="demoService"  ref="demoService2"/>
    </bean>
```

### case 2
This configuration will cause reference bean using default registry config even 
if we define it in XML.
`application.properties`

```ini
dubbo.application.id=demo
dubbo.application.name=demo

# default resgistry
# reference bean will use default registry config even if registry id are 
different.
dubbo.registry.id=registry1
dubbo.registry.address=zookeeper://localhost:2181
dubbo.registry.file=/Users/test/dubbo/registry/default

# this configuration is not going to work
dubbo.demo.registry=zookeeper://localhost:2181
dubbo.registry.file.path=/Users/test/dubbo/registry/registry2
```

`biz-consumer.xml`

```xml
    <dubbo:registry id="registry2" address="${dubbo.demo.registry}" 
file="${dubbo.registry.file.path}" protocol="dubbo" version="1.0.0"/>
    <dubbo:reference id="demoService2" registry="registry2" 
interface="io.test.dubbo.demo.api.DemoService" protocol="dubbo" version="1.0.0" 
check="false"/>
    <bean id="barService" 
class="io.test.dubbo.demo.consumer.client.BarServiceImpl">
        <property name="demoService"  ref="demoService2"/>
    </bean>
```

### case 3

This configuration will cause reference bean using registry defined by 
`dubbo.resgisties.xxx`

`application.properties`

```ini
dubbo.application.id=demo
dubbo.application.name=demo

dubbo.config.multiple=true

# registry 1 config
dubbo.registries.registry1.id=registry1
dubbo.registries.registry1.address=zookeeper://localhost:2181
dubbo.registries.registry1.file=/Users/test/dubbo/registry/registry1

# registry 2 config
# reference bean defined in xml will use this registry as registry id are the 
same
dubbo.registries.registry2.id=registry2
dubbo.registries.registry2.address=zookeeper://localhost:2181
dubbo.registries.registry2.file=/Users/test/dubbo/registry/registry2

# this config is still not going to work
dubbo.demo.registry=zookeeper://localhost:2181
dubbo.registry.file.path=/Users/test/dubbo/registry/registry2_xml
```

`biz-consumer.xml`

```xml
    <dubbo:registry id="registry2" address="${dubbo.demo.registry}" 
file="${dubbo.registry.file.path}" protocol="dubbo" version="1.0.0"/>
    <dubbo:reference id="demoService2" registry="registry2" 
interface="io.test.dubbo.demo.api.DemoService" protocol="dubbo" version="1.0.0" 
check="false"/>
    <bean id="barService" 
class="io.test.dubbo.demo.consumer.client.BarServiceImpl">
        <property name="demoService"  ref="demoService2"/>
    </bean>
```

[ Full content available at: 
https://github.com/apache/dubbo-spring-boot-project/issues/646 ]
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