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注册中心占位符无法解析问题(二)的更多相关文章

  1. dubbo注册中心占位符无法解析问题

    dubbo注册中心占位符无法解析问题 1.背景 最近搞了2个老项目,想把他们融合到一起.这俩项目情况简介如下: 项目一:基于SpringMVC + dubbo,配置读取本地properties文件,少 ...

  2. Spring Cloud Finchley.SR1 版本的坑:placeholer占位符无法解析!

    接入nacos 之后,想把所有的配置丢上去. 启动程序是: @EnableDiscoveryClient @RestController @ComponentScan(basePackages = { ...

  3. ZooKeeper 集群的安装、配置---Dubbo 注册中心

    ZooKeeper 集群的安装.配置.高可用测试 Dubbo 注册中心集群 Zookeeper-3.4.6 Dubbo 建议使用 Zookeeper 作为服务的注册中心. Zookeeper 集群中只 ...

  4. 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 ...

  5. Dubbo框架介绍与安装 Dubbo 注册中心(Zookeeper-3.4.6)

    背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. • 单一应用架构 • 当网站流量很小时, ...

  6. 2016年工作中遇到的问题41-50:Dubbo注册中心奇葩问题,wifi热点坑了

    41.获得JSON中的变量.//显示json串中的某个变量,name是变量名function json(json,name){ var jsonObj = eval(json); return jso ...

  7. spring源码分析之配置文件名占位符的解析(一)

    一.直接写个测试例子 package com.test; import org.junit.Test; import org.springframework.context.ApplicationCo ...

  8. 几个你不知道的dubbo注册中心细节

    你会正确配置backup地址吗? 在配置dubbo注册中心时,一般会这样写 dubbo.registry.protocol=zookeeper dubbo.registry.address=127.0 ...

  9. 这个Dubbo注册中心扩展,有点意思!

    今天想和大家聊聊Dubbo源码中实现的一个注册中心扩展.它很特殊,也帮我解决了一个困扰已久的问题,刚刚在生产中用了,效果很好,迫不及待想分享给大家. Dubbo的扩展性非常灵活,可以无侵入源码加载自定 ...

随机推荐

  1. Git工具的使用教程二

    1.3时光穿梭机--版本回退 版本回退分为两步骤进行操作: 步骤: 1.查看版本,确定需要回到的时候点     指令:             git log             git log ...

  2. MySQL——主从复制

    ---- 高可用 ---- 辅助备份 ---- 分担负载 复制是MySQL的一项功能,允许服务器将更改从一个实例复制到另一个实例. --主服务器将所有数据和结构更改记录到二进制日志中. --从属服务器 ...

  3. Linux触摸驱动分析

    测试平台 宿主机平台:Ubuntu 12.04.4 LTS 目标机:Easy-ARM IMX283 目标机内核:Linux 2.6.35.3 触摸屏基础知识 一.结构 上图是电阻触摸屏的一个侧面剖视图 ...

  4. TCP超时重传、序列号、滑动窗口简介

    文章目录 12 TCP:传输控制协议(初步) 12.1 引言 12.1.1 ARQ和重传 12.1.2 分组窗口和滑动窗口 12.1.3 变量窗口:流量控制和拥塞控制 12.1.4 变量窗口:设置重传 ...

  5. L2TP协议简介

    传送门:L2TP代码实现 1. L2TP 概述 L2TP(Layer 2 Tunneling Protocol,二层隧道协议)是 VPDN(Virtual Private Dial-up Networ ...

  6. [第五篇]——Docker 镜像加速之Spring Cloud直播商城 b2b2c电子商务技术总结

    Docker 镜像加速 国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器.Docker 官方和国内很多云服务商都提供了国内加速器服务,例如: 科大镜像: 网易: 阿里云: 你 ...

  7. Java Web下MySQL数据库的增删改查(一)

    以图书管理系统举例(jsp+servlet+bean) 1.数据库的连接 package db; import java.sql.Connection; import java.sql.DriverM ...

  8. ssh 执行 shell脚本执行jps时:-bash: jps: command not found

    转至: https://www.codeleading.com/article/67592908468/ 我构建了hadoop集群.我们一定会写一个shell脚本去每一个节点上去jps,查看每个节点的 ...

  9. Java面向对象系列(8)- Super详解

    场景一 场景二 场景三 场景四 注意:调用父类的构造器,super()必须在子类构造器的第一行 场景五 场景六 super注意点 super调用父类得构造方法(即构造器),必须在构造方法得第一个 su ...

  10. Linux系列(37) - 源码包与RPM包区别(1)

    源码包是不能使用[service]命令来启动服务,因为源码包的安装位置由用户指定 源码包一般安装在: /usr/local/软件名/ ,源码包安装的服务,只能用绝对路径进行服务的管理 rpm包安装后, ...