从Spring applicationContext自动装配Map到JSF bean

时间:2015-05-22 13:12:28

标签: spring jsf autowired

我有JSF 2.0 + Spring项目,当我尝试将Spring bean自动装入JSF bean时会出现一些奇怪的事情。以下是我的applicationContext示例:

<context:component-scan base-package="com.ticketfront" />

<util:map id="map" > 
    <entry key="rp">
        <util:map>
            <entry key="9003" value="RegP"/>
        </util:map>
    </entry>
</util:map>

这是我的jSF bean的一部分:

@Named
@Scope("session")
public class TicketViewBean implements Serializable {

@Autowired
Map<String, Map<String, String>> map;
}

部署运行成功,但在我的jsf bean autowired属性映射中,第一个条目是正常的,就像我在applicationContext中配置一样,但是还有很多其他条目被放入map中。例如:

map = (java.util.LinkedHashMap) {map={rp={9003=RegP}}, systemEnvironment={USERPROFILE=C:\Users\Administrator, JAVA_HOME=C:\Program Files\Java\jdk1.7.0_40, NB_EXEC_TOMCAT_START_PROCESS_UUID=tomcat70:home=C:\Program Files\Apache Software Foundation\Apache Tomcat 7.0.34:base=apache-tomcat-7.0.34.0_base, SystemDrive=C:, JPDA_TRANSPORT=dt_shmem, CURRENT_DIR=C:\Program Files\Apache Software Foundation\Ap

以及许多其他不同的东西,甚至是WEB-XML ......

我很困惑为什么会发生这种情况

1 个答案:

答案 0 :(得分:1)

正如Spring Reference guide中提到的here

  

只要预期的密钥类型为String,即使是类型化的地图也可以自动装配。 Map值将包含所有预期类型的​​bean ,而键将包含相应的bean名称

所以你得到的是Map Map。这将为您提供自己的Map以及所有其他可以表示为Map或者Map的bean。大多数PropertySource bean就是这种情况,你可以在bean的Map中找到它们。 (systemEnvironment是所有环境变量),依此类推。

要修复,请在您的定义中添加@Qualifier("map"),或使用@Resource代替@Autowired