美文网首页
记一个bug:关于Spring的placeholder,第三方框

记一个bug:关于Spring的placeholder,第三方框

作者: Deeglose | 来源:发表于2018-12-02 14:57 被阅读23次

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

    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认为这个任务不能完成之后,还要继续往前执行呢?脑子真是不好使,有时候抛出异常对大家都有好处,即使这个异常是未受检的。

    相关文章

      网友评论

          本文标题:记一个bug:关于Spring的placeholder,第三方框

          本文链接:https://www.haomeiwen.com/subject/vssuqqtx.html