有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一个SpringBeans配置文件,在其中我将以下jackson类定义为SpringBeans
出于某种原因,在运行时filterProviderbean是在没有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>

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

任何帮助都将不胜感激


共 (3) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

    我刚刚下载了最新的源代码(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不正确)

  3. # 3 楼答案

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

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