为什么spring不使用我的构造函数来初始化这个bean(Map参数)

时间:2012-01-30 10:42:36

标签: java spring jackson

我有一个spring beans配置文件,我将以下jackson类定义为spring bean 出于某种原因,在运行时,filterProvider bean在没有map参数的情况下被实例化 您可以在docs中看到SimpleFilterProvider确实有这样的构造函数,SimpleBeanPropertyFilter实现了BeanPropertyFilter

<bean id="productAttributesAndAdvertiserNameFilter" class="org.codehaus.jackson.map.ser.impl.SimpleBeanPropertyFilter" factory-method="filterOutAllExcept">
        <constructor-arg value="name"/>
    </bean>
    <bean id="offerIdFilter" class="org.codehaus.jackson.map.ser.impl.SimpleBeanPropertyFilter" factory-method="filterOutAllExcept">
        <constructor-arg value="id"/>
    </bean>
    <bean id="filterProvider" class="org.codehaus.jackson.map.ser.impl.SimpleFilterProvider">
        <constructor-arg>
            <util:map value-type="org.codehaus.jackson.map.ser.BeanPropertyFilter">
                <entry key="onlyNameFilter" value-ref="productAttributesAndAdvertiserNameFilter" />
                <entry key="onlyIdFilter" value-ref="offerIdFilter" />
            </util:map>
        </constructor-arg>
    </bean>

更新
截至杰克逊1.9.5,这个问题已得到修复(感谢Tatu)

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:8)

您似乎在SimpleFilterProvider中发现了一个错误。

我刚下载了最新的源代码(1.9.4),构造函数定义如下:

public SimpleFilterProvider() {
    _filtersById = new HashMap<String,BeanPropertyFilter>();
}

/**
 * @param mapping Mapping from id to filter; used as is, no copy is made.
 */
public SimpleFilterProvider(Map<String,BeanPropertyFilter> mapping) {
    _filtersById = new HashMap<String,BeanPropertyFilter>();
}

使用mapping的构造函数忽略它...(即javadoc不正确)

答案 1 :(得分:0)

我认为<util:map>在这里放错了地方。我将它作为一个单独的bean,在过滤器提供程序声明之外,并引用它。或者我将其更改为<map>而没有util命名空间。

答案 2 :(得分:0)

我不明白为什么它不起作用。

最糟糕的是,您可以通过扩展SimpleFilterProvider来创建自己的类,并在Spring上下文中声明这个bean ...