记一个bug:关于Spring的placeholder,第三方框架是如何害死人的

在移植一个项目的过程中,偶然出现了一个问题:

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

该异常对应的配置是:

    
        
        
        
        
        

        
        
        
        
        
    

但是项目的早期并没有出现这种情况,百思不得其解,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认为这个任务不能完成之后,还要继续往前执行呢?脑子真是不好使,有时候抛出异常对大家都有好处,即使这个异常是未受检的。

你可能感兴趣的:(记一个bug:关于Spring的placeholder,第三方框架是如何害死人的)