在spring中无法使用util命名空间setter依赖注入注入HashMap对象

问题描述 投票:0回答:1

我试图使用util命名空间注入HashMap对象但不能为该Object获取HashMap类(LinkedHashMap类名称正在打印。)无法弄清楚为什么会发生这种情况。

我在这个测试中使用Spring jar:

1. spring-beans-5.0.7.RELEASE.jar 
2. spring-context-5.0.7.RELEASE.jar 
3. spring-core-5.0.7.RELEASE.jar 
4. spring-expression-5.0.7.RELEASE.jar 
5. commons-logging-1.1.1.jar 
  1. 豆类: package com.vitp.pkg1; import java.util.HashMap; public class ActualCollections { private HashMap<String,Integer> student; public void setStudent(HashMap<String, Integer> student) { this.student = student; } public void displayData() { System.out.println("Map data(Student<name,rollnumber>) : ---default is LinkedHashMap And actual is :: "+student.getClass().getName()); for(String key : student.keySet()) { System.out.println(key+"::"+student.get(key)); } } }
  2. 用于测试输出的驱动程序类: package com.vitp.start; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.vitp.pkg1.ActualCollections; import com.vitp.pkg1.DefaultCollections; public class ActualCollectionObjectInjectionTest { public static void main(String... s) { ApplicationContext beans = new ClassPathXmlApplicationContext("/com/vitp/resources/particular_collection.xml"); ActualCollections pc = (ActualCollections) beans.getBean("pc"); pc.displayData(); } }
  3. xml配置文件: <!--In this case we need to make use of util namespace so will use xsd instate of dtd.--> <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.xsd"> <bean id="pc" class="com.vitp.pkg1.ActualCollections"> <!--Set Map attribute with setter injection--> <property name="student"> <util:map map-class="java.util.HashMap"> <!-- demonstrating various ways on values for entry--> <entry key="Sachin" value="1"/> <!--way2--> <entry key="Rahul"> <value>2</value> </entry> <!--way3--> <entry key="Vinayak" value-ref="three"/> <!--way4--> <entry key="Salman"> <ref bean="four"/> </entry> </util:map> </property> </bean> <bean id="three" class="java.lang.Integer"> <constructor-arg index="0"> <value>3</value> </constructor-arg> </bean> <bean id="four" class="java.lang.Integer"> <constructor-arg index="0"> <value>4</value> </constructor-arg> </bean> </beans>

结果是:

            Sep 09, 2018 7:17:03 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
            INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@27f8302d: startup date [Sun Sep 09 19:17:03 IST 2018]; root of context hierarchy
            Sep 09, 2018 7:17:03 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
            INFO: Loading XML bean definitions from class path resource [com/vitp/resources/particular_collection.xml]
            Map data(Student<name,rollnumber>) : ---default is LinkedHashMap And actual is :: java.util.LinkedHashMap
            Rahul::2
            Vinayak::3
            Sachin::1
            Salman::4

我期待它应该是HashMap类。

java spring dependency-injection
1个回答
0
投票

您缺少Map的id属性。如果你为地图添加id,它就可以了。工作代码:

<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.xsd">

    <bean id="pc" class="com.vitp.pkg1.ActualCollections">
        <property name="student" ref="someId"/>
    </bean>

    <util:map id="someId" map-class="java.util.HashMap">
        <!-- demonstrating various ways on values for entry-->
        <entry key="Sachin" value="1"/>
        <!--way2-->               
        <entry key="Rahul">
            <value>2</value>
        </entry>
        <!--way3-->
        <entry key="Vinayak" value-ref="three"/>
        <!--way4-->
        <entry key="Salman">
            <ref bean="four"/>
        </entry>
    </util:map>

    <bean id="three" class="java.lang.Integer">
        <constructor-arg index="0">
            <value>3</value>
        </constructor-arg>
    </bean>

    <bean id="four" class="java.lang.Integer">
        <constructor-arg index="0">
            <value>4</value>
        </constructor-arg>
    </bean>

</beans>
© www.soinside.com 2019 - 2024. All rights reserved.