Monday, January 30, 2012

Why isn"t spring using my constructor to init this bean (Map parameter)


I have a spring beans configuration file where I define the following jackson classes as spring beans.





For some reason on run-time the filterProvider bean is instantiated without the map argument.

You can see from the docs that the SimpleFilterProvider does have such a constructor and that SimpleBeanPropertyFilter implements 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>



Any help would be appreciated.

3 comments:

  1. Looks like you've found a bug in SimpleFilterProvider.

    I just downloaded the latest sources (1.9.4) and the constructors are defined as such:

    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>();
    }


    The constructor which takes the mapping ignores it... (i.e. javadoc is incorrect)

    ReplyDelete
  2. I think <util:map> is misplaced here. I'd make it a separate bean, outside of the filter provider declaration, and refer to it. OR I'd change that to a <map> without the util namespace.

    ReplyDelete
  3. I don't see why it is not working.

    At worst, you can create your own class by extending the SimpleFilterProvider and declare this bean in your Spring context...

    ReplyDelete