为什么Spring报告构造函数arg不明确

时间:2014-06-10 09:30:14

标签: java spring spring-bean

我试图初始化这个地图bean:

<bean id="totalEventCountStore" class="java.util.concurrent.ConcurrentHashMap">
    <constructor-arg type="java.util.Map">
        <map key-type="com.company.EventType" value-type="java.util.concurrent.atomic.AtomicLong">
            <entry key="ROUTED_REQUEST">
                <bean class="java.util.concurrent.atomic.AtomicLong">
                    <constructor-arg index="0" type="long" value="0"/>
                </bean>
            </entry>

.... more entries .....

</bean>

我明白了:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'totalEventCountStore' defined in class path resource [diagnostics.xml]: Unsatisfied dependency expressed through constructor argument with index 0 of type [int]: Ambiguous constructor argument types - did you specify the correct bean references as constructor arguments?

有谁知道为什么会这样? ConcurrentHashMap只有一个带有Map参数的构造函数。

感谢。

2 个答案:

答案 0 :(得分:2)

我不确定你的问题是什么,但我确定它不是什么:它与ConcurrentHashMap初始化无关,也与AtomicLong无关。

以下是Spring 3.2.4成功加载的applicationContext的摘录:

<bean id="totalEventCountStore" class="java.util.concurrent.ConcurrentHashMap">
<constructor-arg type="java.util.Map">
    <map key-type="java.lang.String" value-type="java.util.concurrent.atomic.AtomicLong">
        <entry key="ROUTED_REQUEST">
            <bean class="java.util.concurrent.atomic.AtomicLong">
                <constructor-arg index="0" value="0"/>
            </bean>
        </entry>
    </map>
</constructor-arg>
</bean>

我刚接过您的代码并替换了com.company.EventType String我没有com.company.EventType ...也许你应该看看{{1}},因为这是我测试的唯一区别

答案 1 :(得分:1)

这实际上并不是一个答案,但我找到了一种有效的方法。

<bean id="totalEventCountStore" class="java.util.concurrent.ConcurrentHashMap">
    <constructor-arg ref="eventCountInit"/>
</bean>

<util:map id="eventCountInit" map-class="java.util.HashMap" key-type="com.company.RouterDiagnosticEventType" value-type="java.util.concurrent.atomic.AtomicLong">
    <entry key="ROUTED_REQUEST">
        <bean class="java.util.concurrent.atomic.AtomicLong"/>
    </entry>
    <entry key="ROUTED_REQUEST_WITH_METADATA">
        <bean class="java.util.concurrent.atomic.AtomicLong"/>
    </entry>

... more entreies like these ...

</util:map>

尽管如此,我还不知道为什么这种方式有效而另一方没有,所以如果有人发现我真的很感激。

更令人费解的是,[int] arg来自哪里?