在使用Spring时我面临一个奇怪的问题。我有一个类,它将一个集合作为输入,因为该类是底层框架所以我无法改变它。 这是它的声明
private Set evaluate;
public Set getEvaluate()
{
return evaluate;
}
public void setEvaluate(Set evaluate)
{
this.evaluate = evaluate;
}
我是春季档案我有以下条目
<bean id="customService"
class="com.platform.impl.DefaultFrameworkService"
scope="tenant" parent="abstractService">
<property name="evaluate">
<set>
<ref bean="bean1" />
<ref bean="bean2" />
<ref bean="bean3" />
<!-- inject new bean here. -->
<ref bean="bean4" />
</set>
</property>
此处DefaultFrameworkService
设置为输入。所以我所要做的就是将新bean注入底层服务。
我的问题是,当spring读取此文件时,它将sprong.xml的<set>
条目转换为LinkedHashSet
,然后尝试将这些值设置为private Set evaluate
,最终导致异常。
虽然我总是可以覆盖DefaultFrameworkService
,但可以将LinkedHashSet
转换为设置,但希望寻找更好的方法。
我得到的例外是
Failed to convert property value of type 'java.util.LinkedHashSet' to required type 'java.util.Set' for property 'evaluate'
如何让spring仅将值传递为set
而不是LinkedHashSet
更新
我无法设置所有这些,所以我玩了一下创建了一个新的自定义类,CustomDefaultFrameworkService
以及以下实施
public class CustomDefaultFrameworkService extends DefaultFrameworkService
{
Logger log = Logger.getLogger(CustomDefaultFrameworkService.class);
@SuppressWarnings("unused")
private Set evaluate;
/**
* @param evaluateStrategies
* the evaluateStrategies to set
*/
@Override
public void setEvaluate(final Set evaluate)
{
log.info("Setting values to super class. Total values being injected are " + evaluateStrategies.size());
super.setEvaluate(evaluate);
}
}
我可以将地图设置为超类。这件事让我更加困惑。
答案 0 :(得分:1)
使用util
namespace,元素set
有一个参数set-class
,您可以在其中指定要使用的实现。
<?xml version="1.0" encoding="UTF-8"?>
<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-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<util:set id="emails" set-class="my.custom.set.implmentation">
<value>pechorin@hero.org</value>
<value>raskolnikov@slums.org</value>
<value>stavrogin@gov.org</value>
<value>porfiry@gov.org</value>
</util:set>
</beans>