【问题标题】:Spring inject map issue春季注入地图问题
【发布时间】:2016-03-03 15:55:43
【问题描述】:

我看到以下错误,它试图将地图注入 bean。我不确定 Spring 是如何推断出我尝试注入的地图是 org.apache.commons.collections.map.LinkedMap 类型的。我该如何解决这个问题?

[org.apache.commons.collections.map.LinkedMap] 到所需类型 [java.util.LinkedHashMap] 用于属性“asyncConnectorDaoMap”;嵌套的 异常是 java.lang.IllegalArgumentException:无法转换值 [org.apache.commons.collections.map.LinkedMap] 类型为必需 输入 [java.util.LinkedHashMap]

弹簧配置

<bean id="fulfillment.management.AsyncConnectorFactory" class="com.service.async.AsyncConnectorFactory">      <property name="asyncConnectorDaoMap">         <map key-type="java.lang.String" value-type="com.service.async.AsyncConnectorDao">
                     <entry key="ACCOUNT_MANAGEMENT_CONTROLLER" value-ref="core.commons.AsyncConnectorDao"></entry>
                     <entry key="CUSTOMER_SERVICE" value-ref="core.commons.AsyncConnectorDao"></entry>
                     <entry key="ACCOUNT_SERVICE" value-ref="core.commons.AsyncConnectorDao"></entry>
                     <entry key="LOCATION_SERVICE" value-ref="core.commons.AsyncConnectorDao"></entry>        </map>       </property>  </bean>

代码如下

import java.util.LinkedHashMap;


public class AsyncConnectorFactory {

    private LinkedHashMap<String, AsyncConnectorDao> asyncConnectorDaoMap;

    public LinkedHashMap<String, AsyncConnectorDao> getAsyncConnectorDaoMap() {
        return asyncConnectorDaoMap;
    }

    public void setAsyncConnectorDaoMap(
            LinkedHashMap<String, AsyncConnectorDao> asyncConnectorDaoMap) {
        this.asyncConnectorDaoMap = asyncConnectorDaoMap;
    }

    public AsyncConnectorDao getAsyncConcurrentConnectorDao(String serviceIdentifier) {
        return asyncConnectorDaoMap.get(serviceIdentifier);
    }
}

修改后的工作配置

    <bean id="fulfillment.management.AsyncConnectorFactory" class="com.service.async.AsyncConnectorFactory">
      <property name="asyncConnectorDaoMap" ref="asyncConnectorDaoMap1"/>
</bean> 

<util:map id="asyncConnectorDaoMap1" map-class="java.util.LinkedHashMap">
             <entry key="ACCOUNT_MANAGEMENT_CONTROLLER" value-ref="core.commons.AsyncConnectorDao"></entry>
             <entry key="CUSTOMER_SERVICE" value-ref="core.commons.AsyncConnectorDao"></entry>
             <entry key="ACCOUNT_SERVICE" value-ref="core.commons.AsyncConnectorDao"></entry>
             <entry key="LOCATION_SERVICE" value-ref="core.commons.AsyncConnectorDao"></entry>

【问题讨论】:

    标签: java spring


    【解决方案1】:

    您是否尝试过先创建地图,然后将其作为参考传递。

    <util:map id="p:asyncConnectorDaoMap" map-class="java.util.LinkedHashMap">
        <entry key="ACCOUNT_MANAGEMENT_CONTROLLER" value-ref="asyncConnectorDao"/>
        <entry key="CUSTOMER_SERVICE" value-ref="asynConnectorService"/
    </util:map>
    
    <bean id="asyncConnectorDao" class="core.commons.AsyncConnectorDao" />
    <bean id="asynConnectorService" class="core.commons.AsyncConnectorService" />
    
    
    <bean id="fulfillment.management.AsyncConnectorFactory" class="com.service.async.AsyncConnectorFactory">      
        <property name="asyncConnectorDaoMap" ref="asyncConnectorDaoMap"/>       
    </bean>
    

    确保您的 DAO 和服务 bean 已创建。考虑使用MapFactoryBean

    使用schema,供util使用

    http://www.springframework.org/schema/util 
    http://www.springframework.org/schema/util/spring-util-3.0.xsd
    

    【讨论】:

    • 谢谢Koitoer,我定义的方式有什么问题吗?
    • 我认为问题出在 value-ref 中,似乎你指向的是一个类而不是一个 bean
    • 感谢 Kotoer ,现在可以使用了。我已经粘贴了工作配置。
    猜你喜欢
    • 1970-01-01
    • 2016-09-07
    • 2015-07-25
    • 2011-10-19
    • 1970-01-01
    • 2016-06-29
    • 2016-12-14
    • 1970-01-01
    相关资源
    最近更新 更多