Java 为什么不是';t spring使用我的构造函数初始化这个bean(映射参数)

Java 为什么不是';t spring使用我的构造函数初始化这个bean(映射参数),java,spring,jackson,Java,Spring,Jackson,我有一个SpringBeans配置文件,其中我将以下jackson类定义为SpringBeans。 由于某些原因,在运行时,filterProviderbean在没有map参数的情况下被实例化。 您可以从中看到,SimpleFilterProvider确实有这样一个构造函数,SimpleBeanPropertyFilter实现了BeanPropertyFilter <bean id="productAttributesAndAdvertiserNameFilter" c

我有一个SpringBeans配置文件,其中我将以下jackson类定义为SpringBeans。
由于某些原因,在运行时,
filterProvider
bean在没有map参数的情况下被实例化。
您可以从中看到,
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>

更新:
从Jackson 1.9.5开始,此问题已修复(感谢Tatu)


任何帮助都将不胜感激。

我认为
放错了地方。我将使它成为一个独立的bean,在过滤器提供者声明之外,并引用它。或者我会将其更改为
,而不使用
util
名称空间。

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


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

看起来您在
SimpleFilterProvider
中发现了一个bug

<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.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>();
}
公共SimpleFilterProvider(){ _filtersById=新HashMap(); } /** *@param从id映射到过滤器;按原样使用,不复制。 */ 公共SimpleFilterProvider(映射映射){ _filtersById=新HashMap(); }
接受
映射的构造函数将忽略它。。。(即javadoc是不正确的)

不过,我不确定这是如何解决问题的。撇开风格的问题不谈,它应该还能用。@duffymo我以前试过把它提取到一个单独的bean中,但没有用。我也试着按照你的建议改成
,但没用…@skaffman我同意。我还可以说,当我把地图“放在外面”并自动连接到某个地方,只是为了看看里面有什么,我看到地图被填充了。问题在于spring在创建bean时没有使用参数。也许您使用的方法版本与您正在阅读的文档不同。尽管我觉得Spring会抱怨参数不匹配。你有堆栈跟踪吗?@AHungerArtist这些文档是1.9.4版本的,我使用的是1.9.2版本,我检查了1.9.2版本的文档,它们是一样的。不幸的是,我没有任何堆栈跟踪,因为Spring不会抛出任何错误。它只是用它没有参数构造函数来实例化bean。吉拉提出,塔图通常擅长快速修复这些东西。