-
Notifications
You must be signed in to change notification settings - Fork 313
排查问题
当遇到没有办法把变量注入到Spring的${}表达式时,可以按下面的步骤来排查。
暂时去掉项目里的所有日志配置,把所有的日志全设置为level为DEBUG。比如logbakc的配置:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<charset>utf-8</charset>
<Pattern>[%p] %c - %m%n</Pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
如果成功设置的话,可以看到详细的xdiamond client连接服务器的细节信息,包括tcp数据流信息。
因为fastjson的低版本在处理循环引用时有bug,所以建议和xidamond client里依赖的版本一致。
参考:https://github.com/hengyunabc/xdiamond/issues/6
建议有一个application-root.xml,里面在最前面配置XDiamond Client,然后再在后面import其它的Spring配置。
如果有使用<context:property-placeholder/>
,则其它配置的PropertySourcesPlaceholderConfigurer bean都不会生效。
这个是Spring自身的问题。尽管使用<context:property-placeholder/>
很方便,但是建议最好不要使用。
当在web项目时,通常会有两个Spring Context,一个是平常的Spring Context,在web.xml里的Listener加载的。另外一个是Spring MVC的Context。它们俩是父子关系。父Context里获取不到子Context里的Bean信息的。
详细可以参考:http://blog.csdn.net/hengyunabc/article/details/47072637
建议在两个Spring Context的主配置文件里都import XDiamond Client的配置。
有一个终极的排查问题办法,就是去掉XDiamond Client的配置。因为从原理上,XDiamond Client是提供了一个Properties对象,然后把这个Properties交给Spring的PropertySourcesPlaceholderConfigurer。
可以从XDiamond Server的界面上,或者XDiamond Client启动的日志上,获取到所有的配置,保存为一个本地的Properties文件,然后再加载。
类似下面的方法:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:local.properties" />
如果还是报错,则不是XDiamond Client引起的问题。
比如检查配置是否有空格,这种容易在url或者ip上出现,这种容易出现初始化错误。
当有多个PropertyPlaceholderConfigurer时,容易出现覆盖等现象,需要特别注意。