Почему весна не использует мой конструктор для инициализации этого компонента (параметр Map) - PullRequest
2 голосов
/ 30 января 2012

У меня есть файл конфигурации Spring Bean, в котором я определяю следующие классы Джексона как Spring Bean.
По какой-то причине во время выполнения экземпляр filterProvider создается без аргумента 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>

Обновление:
Начиная с Джексона 1.9.5 эта проблема исправлена ​​(спасибо Тату)

Любая помощь будет оценена.

Ответы [ 3 ]

8 голосов
/ 30 января 2012

Похоже, вы нашли ошибку в 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)

0 голосов
/ 30 января 2012

Я не понимаю, почему он не работает.

В худшем случае вы можете создать свой собственный класс, расширив SimpleFilterProvider и объявив этот компонент в контексте Spring ...

0 голосов
/ 30 января 2012

Я думаю <util:map> здесь неуместно. Я бы сделал это отдельным компонентом вне декларации поставщика фильтра и ссылался бы на него. ИЛИ я бы изменил это на <map> без util пространства имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...