在移植一个项目的过程中,偶然出现了一个问题:
Caused by: java.lang.NumberFormatException: For input string: "${db.maxPoolSize}"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:481)
at java.lang.Integer.valueOf(Integer.java:582)
at org.springframework.util.NumberUtils.parseNumber(NumberUtils.java:193)
at org.springframework.beans.propertyeditors.CustomNumberEditor.setAsText(CustomNumberEditor.java:113)
at org.springframework.beans.TypeConverterDelegate.doConvertTextValue(TypeConverterDelegate.java:450)
at org.springframework.beans.TypeConverterDelegate.doConvertValue(TypeConverterDelegate.java:423)
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:195)
at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:461)
... 64 more
该异常对应的配置是:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${db.driverClass}" />
<property name="jdbcUrl" value="${db.jdbcUrl}" />
<property name="user" value="${db.user}" />
<property name="password" value="${db.password}" />
<property name="maxPoolSize" value="${db.maxPoolSize}" />
<property name="minPoolSize" value="${db.minPoolSize}" />
<property name="initialPoolSize" value="${db.initialPoolSize}" />
<property name="maxIdleTime" value="${db.maxIdleTime}" />
<property name="maxStatements" value="${db.maxStatements}" />
<property name="acquireIncrement" value="${db.acquireIncrement}" />
</bean>
但是项目的早期并没有出现这种情况,百思不得其解,google搜索发现这个问题以前是MapperScannerConfigurer的处理方式有问题,大多人换用sqlSessionFactoryBeanName配置后问题都解决了,而我的项目中一直出现这个恼人的问题。
后来怀疑是第三方封装spring框架的原因,于是打开代码调试,忽然发现报了一个异常但是异常被静默消化掉了,异常语句是:
spring异常
spring框架异常
静默消化的异常信息:ConflictingBeanDefinitionException
: Annotation-specified bean name 'adMapper' for bean class [com.vivo.ads.persist.mapper.ocpc.AdMapper] conflicts with existing, non-compatible bean definition of same name and class [com.vivo.ads.security.dal.mapper.AdMapper]
这个异常本来应当抛出以停止初始化的,但是第三方框架将它消化掉了,导致错误延后出现,继而出现了难以查找原因的bug。
经查原来是一个新建的Mapper和一个引入的Mapper重名(限定名完全相同)导致的,之后改个名字就OK了。
不得不说,第三方框架还是做得很粗糙。有待改进,有时候调试源代码也是必要的,当然,熟知Spring原理才是王道。
第三方框架为什么在Spring认为这个任务不能完成之后,还要继续往前执行呢?脑子真是不好使,有时候抛出异常对大家都有好处,即使这个异常是未受检的。
网友评论