如何定义要用于<set> </set>的自定义Set实现

时间:2011-11-14 06:54:36

标签: java spring

在使用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);

    }
}

我可以将地图设置为超类。这件事让我更加困惑。

1 个答案:

答案 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>

@See Spring Reference Chapter C.2.2.6