dubbo注册中心占位符无法解析问题(二)
dubbo注册中心占位符无法解析问题
前面分析了dubbo注册中心占位符无法解析的问题。
并给出了2种解决办法:
- 降低mybatis-spring的版本至2.0.1及以下
- 自定义MapperScannerConfigurer,设置processPropertyPlaceHolders为false
不过,末尾遗留了一个疑问,这篇文章就来分析下这个问题
合并前的老项目二使用的就是mybatis-spring-2.0.3.jar,但是他没有报【UnknownHostException: ${zk.address}】,也没有自定义MapperScannerConfigurer设置processPropertyPlaceHolders为false
1、问题分析
根据前面的经验,在如下位置加上断点,debug走起
org.springframework.context.support.PropertySourcesPlaceholderConfigurer#postProcessBeanFactory
com.alibaba.dubbo.config.RegistryConfig#setAddress
一番debug走下来,发现RegistryConfig#setAddress确实传的是apollo上配置的值。
也就是说PropertySourcesPlaceholderConfigurer在RegistryConfig对象初始化之前就调了。
这不打脸了吗?前面一顿分析,解决方法都给出来了, ̄□ ̄||
继续往前分析下,看看调用栈,RegistryConfig是因为ReferenceBean#afterPropertiesSet的执行,而被创建的。那么,再增加一个断点
com.alibaba.dubbo.config.spring.ReferenceBean#afterPropertiesSet
多次debug发现,进入ReferenceBean#afterPropertiesSet的时候,在如下位置其实是报错了
public void afterPropertiesSet() throws Exception {
// ...此处省略若干代码...
if (getApplication() == null
&& (getConsumer() == null || getConsumer().getApplication() == null)) {
Map<String, ApplicationConfig> applicationConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ApplicationConfig.class, false, false);
// !! BeanFactoryUtils.beansOfTypeIncludingAncestors报错了 !!
if (applicationConfigMap != null && applicationConfigMap.size() > 0) {
// ...此处省略若干代码...
}
// ...此处省略若干代码...
}
}

完整的错误消息
org.springframework.beans.factory.BeanCreationException: Error creating bean with name '${dubbo.application.name}': Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'name' threw exception; nested exception is java.lang.IllegalStateException: Invalid name="${dubbo.application.name}" contains illegal character, only digit, letter, '-', '_' or '.' is legal.
这不过这个错误,Spring最终没有抛出来,不仅没抛出异常,还destroy了这个创建了一半的bean

并在后面,打印了毫不起眼的debug级别日志
DEBUG o.s.b.f.s.DefaultListableBeanFactory - Bean creation exception on non-lazy FactoryBean type check: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jobCallback': Invocation of init method failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '${dubbo.application.name}': Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'name' threw exception; nested exception is java.lang.IllegalStateException: Invalid name="${dubbo.application.name}" contains illegal character, only digit, letter, '-', '_' or '.' is legal.
原来还有这种骚操作!
MapperScannerConfigurer --> 创建 --> 未解析dubbo.application.name,创建ApplicationConfig异常 --> 销毁掉 延后再创建 --> PropertySourcesPlaceholderConfigurer --> 延后创建
再回过头来看了下 老项目二 的spring-dubbo-common.xml里面的配置,它在配置的时候 用的${dubbo.application.name},而不是具体值!
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="${dubbo.application.name}"/>
<!--
新项目里面,我写的是这样子的
<dubbo:application name="dc-dubbo"/>
-->
<dubbo:registry address="${zk.address}" protocol="zookeeper"/>
<dubbo:protocol name="dubbo" port="21660" threadpool="fixed" threads="300"/>
</beans>
啊!!我有一种负负得正、错错得对的感觉!!
2、解决办法
2.1、方法三
xml改成
<dubbo:application name="${dubbo.application.name}"/>
并增加dubbo.application.name的配置
dubbo注册中心占位符无法解析问题(二)的更多相关文章
- dubbo注册中心占位符无法解析问题
dubbo注册中心占位符无法解析问题 1.背景 最近搞了2个老项目,想把他们融合到一起.这俩项目情况简介如下: 项目一:基于SpringMVC + dubbo,配置读取本地properties文件,少 ...
- Spring Cloud Finchley.SR1 版本的坑:placeholer占位符无法解析!
接入nacos 之后,想把所有的配置丢上去. 启动程序是: @EnableDiscoveryClient @RestController @ComponentScan(basePackages = { ...
- ZooKeeper 集群的安装、配置---Dubbo 注册中心
ZooKeeper 集群的安装.配置.高可用测试 Dubbo 注册中心集群 Zookeeper-3.4.6 Dubbo 建议使用 Zookeeper 作为服务的注册中心. Zookeeper 集群中只 ...
- dubbo注册中心zookeeper出现异常 Opening socket connection to server 10.70.42.99/10.70.42.99:2181. Will not attempt to authenticate using SASL (无法定位登录配置)
linux下,zookeeper安装并启动起来了 DEMO时,JAVA控制台出现: INFO 2014-03-06 09:48:41,276 (ClientCnxn.java:966) - Openi ...
- Dubbo框架介绍与安装 Dubbo 注册中心(Zookeeper-3.4.6)
背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. • 单一应用架构 • 当网站流量很小时, ...
- 2016年工作中遇到的问题41-50:Dubbo注册中心奇葩问题,wifi热点坑了
41.获得JSON中的变量.//显示json串中的某个变量,name是变量名function json(json,name){ var jsonObj = eval(json); return jso ...
- spring源码分析之配置文件名占位符的解析(一)
一.直接写个测试例子 package com.test; import org.junit.Test; import org.springframework.context.ApplicationCo ...
- 几个你不知道的dubbo注册中心细节
你会正确配置backup地址吗? 在配置dubbo注册中心时,一般会这样写 dubbo.registry.protocol=zookeeper dubbo.registry.address=127.0 ...
- 这个Dubbo注册中心扩展,有点意思!
今天想和大家聊聊Dubbo源码中实现的一个注册中心扩展.它很特殊,也帮我解决了一个困扰已久的问题,刚刚在生产中用了,效果很好,迫不及待想分享给大家. Dubbo的扩展性非常灵活,可以无侵入源码加载自定 ...
随机推荐
- Docker数据映射
1.映射目录 docker run -v 2.映射文件 docker run -v
- MFGTool2 的使用
环境 宿主机平台:Ubuntu 16.04.6 目标机:iMX6ULL开发板 MFGTool 2.7 参考:https://www.cnblogs.com/helloworldtoyou/p/6053 ...
- MacOS安装和卸载Java
安装java 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 设 ...
- python库--pandas--Series.str--字符串处理
原数据 import pandas as pd a = pd.Series(['aSd', 'asd', 'dfd fsAsf sfs']) b = pd.Series([None, 'asd', ' ...
- -bash: ulimit: core file size: cannot modify limit: Operation not permitted
一.问题描述 使用普通用户执行某个软件加载环境变量时报错 -bash: ulimit: core file size: cannot modify limit: Operation not permi ...
- Maven专题3——生命周期与插件
三套生命周期 Maven有3套相互独立的生命周期,用户可以调用某个生命周期的阶段,而不会对其他生命周期产生影响. 每个生命周期包含一些有先后顺序的阶段,后面的阶段依赖于前面的阶段,意味着用户调用后面的 ...
- Elaticsearch基础概念
概述 elaticsearch是一个分布式的搜索引擎,它可以实现各种复杂的数据类型实现近实时的搜索功能,无论是结构化还是非结构化的数据,都能使用elaticsearch存储并且可以快速搜索.elati ...
- BZOJ_1008 越狱(快速幂)
http://www.lydsy.com/JudgeOnline/problem.php?id=1008 Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教 ...
- UI自动化测试:App的Webview页面元素左滑
一.前言 在做App自动化测试时,我们会遇到如上图所示的列表数据页面左滑删除场景,一般可以通过location.rect方法获取对应列表的元素坐标,然后使用TouchAction或者swipe滑动 ...
- CURL的模拟登录和抓取页面
<?php $curl = curl_init();// 初始化 // 准备提交的表单数据之账号和密码.(这个是根据表单选项来的) $data = "_username=6049892 ...