spring读pom.xml中的值报错 Failed to convert property value of type 'java.lang.String' to required type ...

本来是准备修改下redis的配置,增加了几个参数设置,结果在pom.xml之中增加了两行配置,然后spring启动就会报错。

pom.xml修改如下:

<redis.testOnReturn>true</redis.testOnReturn>
<redis.maxTotal>100</redis.maxTotal>

spring配置如下:

<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <property name="maxIdle" value="${redis.maxIdle}"/>
    <property name="maxTotal" value="${redis.maxTotal}"/>
    <property name="maxWaitMillis" value="${redis.maxWaitMillis}"/>
    <property name="testOnBorrow" value="${redis.testOnBorrow}"/>
    <property name="testOnReturn" value="${redis.testOnReturn}"/>
</bean>

接下来启动就报错了:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘jedisSentinelPool’ defined in ServletContext resource [/WEB-INF/conf/spring/applicationContext.xml]: Cannot resolve reference to bean ‘poolConfig’ while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘poolConfig’ defined in ServletContext resource [/WEB-INF/conf/spring/applicationContext.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type ‘java.lang.String’ to required type ‘int’ for property ‘maxTotal’; nested exception is java.lang.NumberFormatException: For input string: “${redis.maxTotal}”
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:336)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:632)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:140)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1114)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1017)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1017)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
… 86 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘poolConfig’ defined in ServletContext resource [/WEB-INF/conf/spring/applicationContext.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type ‘java.lang.String’ to required type ‘int’ for property ‘maxTotal’; nested exception is java.lang.NumberFormatException: For input string: “${redis.maxTotal}”
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:547)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
… 101 more
Caused by: org.springframework.beans.TypeMismatchException: Failed to convert property value of type ‘java.lang.String’ to required type ‘int’ for property ‘maxTotal’; nested exception is java.lang.NumberFormatException: For input string: “${redis.maxTotal}”
at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:479)
at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:511)
at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:505)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1502)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1461)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1197)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
… 107 more
Caused by: java.lang.NumberFormatException: For input string: “${redis.maxTotal}”
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:569)
at java.lang.Integer.valueOf(Integer.java:766)
at org.springframework.util.NumberUtils.parseNumber(NumberUtils.java:171)
at org.springframework.beans.propertyeditors.CustomNumberEditor.setAsText(CustomNumberEditor.java:113)
at org.springframework.beans.TypeConverterDelegate.doConvertTextValue(TypeConverterDelegate.java:430)
at org.springframework.beans.TypeConverterDelegate.doConvertValue(TypeConverterDelegate.java:403)
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:181)
at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:459)
… 113 more

由于其他的参数配置是没有问题的,只有我新增加的两个参数是有问题的,中间尝试了下删掉pom.xml的定义,然后发现报错没有变!
所以问题很明显,报错其实说是转换问题,其实根本原因是没有读进去。报转换异常原因可能是没有定义,从而默认是””,从而导致了转换异常。

问题发现了,但是还没有发现为什么读不进去,很尴尬。最后仔细搜其他的配置,终于发现了,其实spring读pom.xml里面定义的参数,还有一个中间的文件进行声明。

spring之中还有一个定义:

<context:property-placeholder location=”classpath:conf.properties” ignore-unresolvable=”true”/>

这里指向了conf.properties这个属性文件 ,里面内容为:

#redis
redis.host=${redis.host}
redis.port=${redis.port}
redis.database=${redis.database}
redis.maxIdle=${redis.maxIdle}
redis.maxWaitMillis=${redis.maxWaitMillis}

最后在conf.properties之中加上了我定义的两个参数,问题解决。
百度了下,发现spring读取pom.xml文件确实要有中间的文件,归根结底还是自己不清楚原理,后续会再琢磨下,这里先记录一下~

    原文作者:天天向丶上
    原文地址: https://www.jianshu.com/p/cf1c3e3a0f75
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞