我遇到以下问题,看来propertyConfigurer的注入属性似乎无法正常工作。
我得到的错误是......
Caused by: java.lang.NumberFormatException: For input string: "${db.maxactive}"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:449)
at java.lang.Integer.valueOf(Integer.java:554)
at org.springframework.util.NumberUtils.parseNumber(NumberUtils.java:155)
at org.springframework.beans.propertyeditors.CustomNumberEditor.setAsText(CustomNumberEditor.java:115)
at org.springframework.beans.TypeConverterDelegate.doConvertTextValue(TypeConverterDelegate.java:434)
at org.springframework.beans.TypeConverterDelegate.doConvertValue(TypeConverterDelegate.java:406)
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:163)
at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:470)
从堆栈跟踪中,它尝试将值“$ {db.maxactive}”注入dbcp驱动程序。 如果我打开日志记录,我可以看到以下内容(这是我不注入该属性时的堆栈跟踪)...
[INFO] Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@19bd03e: startup date [Thu Jun 27 08:58:08 BST 2013]; root of context hierarchy
[INFO] Loading XML bean definitions from class path resource [conf/spring/applicationContext-StandAlone.xml]
[INFO] Loading XML bean definitions from class path resource [conf/spring/applicationContext-monitoring.xml]
[INFO] Loading XML bean definitions from class path resource [conf/spring/dataAccessContext-local.xml]
[INFO] Loading XML bean definitions from class path resource [conf/spring/applicationContext-jdbc.xml]
[INFO] Loading XML bean definitions from class path resource [conf/spring/applicationContext-beans.xml]
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/porterj/.m2/repository/org/slf4j/slf4j-jdk14/1.6.1/slf4j-jdk14-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/porterj/.m2/repository/org/slf4j/slf4j-nop/1.6.1/slf4j-nop-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
** * * 在加载jdbc.properties之前,会抛出异常。 [INFO]从类路径资源[jdbc.properties]
加载属性文件这让我觉得propertyConfigurer在尝试注入值后会被加载,因此它会注入参数名,而不是参数值。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreUnresolvablePlaceholders" value="false"/>
<property name="locations">
<list>
<value>classpath:/jdbc.properties</value>
</list>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
<property name="maxActive" value="${db.maxactive}"/>
</bean>
然后是我的jdbc.properties文件......
db.driver=com.ibm.db2.jcc.DB2Driver
db.url=jdbc:db2://dbserver:51000/db
db.username=dm
db.password=pass
db.maxactive=20
java class ...
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/applicationContext-StandAlone.xml");
有人可以给我一些建议吗,这是因为我是从一个独立的应用程序这样做的吗?我已经在Web应用程序中多次完成了这个,并且propertyConfigurer工作正常。
注意:Spring 3.1.2.RELEASE
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
答案 0 :(得分:2)
我认为找到jdbc.properties
文件可能会有问题。
它抱怨${db.maxactive}
,但可能如果你硬编码这个值,它会开始抱怨下一个。
尝试在属性文件位置定义中使用classpath*:
:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreUnresolvablePlaceholders" value="false"/>
<property name="locations">
<list>
<value>classpath*:jdbc.properties</value>
</list>
</property>
</bean>
您可以在资源路径here中找到有关使用通配符的更多信息。
答案 1 :(得分:2)
我之前在我正在开发的应用程序中看到过这个;我发现问题与mybatis有关,并且SqlSessionFactoryBean存在问题。我没有挖得太深,但如果你想再研究一下这个link - 即使你没有使用mybatis也可能有类似的东西。
我可以看到我的bean正在实例化,并且在从文件加载属性之前设置了它们的属性。
我没有使用Spring PropertyPlaceholderConfigurer,而是使用spring“util:properties”机制来加载属性 - 一旦我转移到这个,它就开始工作了。尝试下面的代码 - 可能对你有用......
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<util:properties id="dataSourceProps" location="classpath:jdbc.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="#{dataSourceProps['db.driver']}" />
<property name="url" value="#{dataSourceProps['db.url']}" />
<property name="username" value="#{dataSourceProps['db.username']}" />
<property name="password" value="#{dataSourceProps['db.password']}" />
<property name="maxActive" value="#{dataSourceProps['db.maxactive']}" />
</bean>
....
</beans>
答案 2 :(得分:1)
以下代码对我有用。看看它是否对你有帮助。
<!-- Remove id of bean -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:/jdbc.properties</value>
</list>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName"><value>${db.driver}</value></property>
</bean>
答案 3 :(得分:0)
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--basePackage指定要扫描的包,在此包之下的映射器都会被搜索到。
可指定多个包,包与包之间用逗号或分号分隔-->
<property name="basePackage" value="com.hebeu.persist" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
元素的属性必须是值而不是ref 我解决了同样的问题