2012-01-30 19 views
2

我有一个spring bean配置文件,我将spring的下列类定义为spring bean。
由于运行时的某些原因,filterProvider bean在没有map参数的情况下被实例化。
您可以从docs看到SimpleFilterProvider确实有这样的构造函数,并且SimpleBeanPropertyFilter实现BeanPropertyFilter为什么不是spring使用我的构造函数来初始化这个bean(Map参数)

<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的修复此问题(感谢大肚)

任何帮助,将不胜感激。

+0

也许你使用的方法不同于你正在阅读的文档。虽然我觉得Spring会抱怨参数不匹配。你有没有任何堆栈跟踪? – AHungerArtist 2012-01-30 11:03:05

+0

@AHungerArtist文档是1.9.4,我使用1.9.2,我检查了1.9.2的文档,它们是一样的。不幸的是,我没有任何堆栈跟踪,因为Spring不会抛出任何错误。它只是通过它没有arg构造函数来实例化bean。 – Ittai 2012-01-30 11:07:15

回答

8

看起来你已经发现了一个bug在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

哈,这很糟糕。好工作。 – AHungerArtist 2012-01-30 11:11:29

+2

哦,讨厌。 JIRA提交,Tatu通常很擅长处理这些事情。 http://jira.codehaus.org/browse/JACKSON-773 – skaffman 2012-01-30 11:19:02

+0

+1 - 非常出色的作品。 – duffymo 2012-01-30 13:06:57

0

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

+0

虽然,我不确定这是如何解决问题的。抛开风格的问题,它应该仍然有效。 – skaffman 2012-01-30 10:49:15

+0

@duffymo我试着将它解压到一个单独的bean之前,它不起作用。我也尝试改变为''按照你的建议,但它没有工作... – Ittai 2012-01-30 10:59:33

+0

@skaffman我同意。我还可以说,当我将地图“外部”并自动装配到某个地方时,只是为了查看内部地图的内容。问题在于Spring在创建bean时没有使用参数。 – Ittai 2012-01-30 11:00:49

0

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

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

相关问题