c命名空间和类型转换

时间:2012-03-13 17:11:08

标签: java spring

我有一个带有4个Integer args的构造函数的类。它在spring xml中配置如下:

<bean id="mySearchService" class="app.service.MySearchService"
    c:maxConnectionsPerHost="${maxConnectionsPerHost}"
    c:maxTotalConnections="${maxTotalConnections}"
    c:connectionTimeout="${connectionTimeout}"
    c:soTimeout="${soTimeout}" />

我的属性文件包含:

maxConnectionsPerHost=50
maxTotalConnections=50
connectionTimeout=500
soTimeout=100

但是我收到以下错误:

  

创建在类路径资源[applicationContext.xml]中定义名称为'mySearchService'的bean时出错:通过构造函数参数表达的不满意的依赖关系,索引1的类型为[java.lang.Integer]:不明确的构造函数参数类型 - 您是否指定了正确的bean引用作为构造函数参数?

如果我使用<constructor-arg value="..." />,这是有效的,所以我想知道c命名空间是否不像构造函数arg那样输入转换。

2 个答案:

答案 0 :(得分:0)

The documentation提到:

  

p-namespace不如标准XML格式灵活。例如,声明属性引用的格式与以Ref结尾的属性冲突,而标准XML格式则不然。

那:

  

c:命名空间使用与p:命名空间相同的约定(对于bean引用尾随-ref),用于按名称设置构造函数参数。

据此,我推断 - 虽然文档似乎没有明确说明 - 你实际上需要写:

<bean id="mySearchService" class="app.service.MySearchService"
    c:max-connections-per-host="${maxConnectionsPerHost}"
    c:max-total-connections="${maxTotalConnections}"
    c:connection-timeout="${connectionTimeout}"
    c:so-timeout="${soTimeout}" />

使用带连字符的属性名而不是驼峰式。

答案 1 :(得分:0)

我很确定这就是原因:

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/beans.html#beans-factory-ctor-arguments-resolution

所有参数都属于同一类型,并且参数名称可能在运行时不可用(无调试信息)。我可以提供索引或使用@ConstructorProperties注释使名称可见。