Инжекция пружинной зависимости во внешнюю банку

У меня есть проект А, который потребляет банку, скажем, B.jar (где B - другой проект, используемый в качестве зависимости в нашем проекте A), теперь есть Bean (вид Spring-gemfire кеш), который содержит все необходимые данные на карте. Этот бин карты используется проектом (включен как jar в моем проекте) т.е. B, чтобы прочитать свойства кэша, но я не могу сделать так, чтобы помочь?

мой webapp-config.xml для проекта B

    <!-- Injecting bean in our A application -->
    <bean id="foo" class="com.abc.solutions.Foo" init-method="loadFoo">
             <property name="bar1" ref="gemFireBean"/>
             <property name="bar2" ref="commonBean"/>
    </bean>

    <bean id="b2" class="java.util.HashMap"
       factory-bean="foo" factory-method="createB2" autowire="byName">
    </bean>

вышеупомянутый bean-компонент b2 должен использоваться во внешнем проекте B (включен как jar в мой проект A).

часть проекта clas sin B2

@Autowired
    @Qualifier("b2")
    private Map<String, String> mapFromA;

но я получаю

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.String] found for dependency

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

2 ответа

Решение

Краткий ответ: HashMap (или любой другой универсальный контейнер, такой как массивы или коллекции) никогда не должен быть Spring Bean. Только бизнес-объекты должны быть компонентами, а не контейнерами инфраструктуры.

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


То, что происходит в вашем случае, изложено в @Autowired раздел руководства:

Даже набранные карты могут быть подключены автоматически, если ожидаемый тип ключа - String. Значения Map будут содержать все bean-компоненты ожидаемого типа, а ключи будут содержать соответствующие имена bean-компонентов:

public class MovieRecommender {

    private Map<String, MovieCatalog> movieCatalogs;

    @Autowired
    public void setMovieCatalogs(Map<String, MovieCatalog> movieCatalogs) {
        this.movieCatalogs = movieCatalogs;
    }

    // ...

}

Т.е. Spring думает, что вам нужна карта, где ключами являются имена бинов, а значения - бины типа string.

Бины, которые сами определены как тип коллекции или карты, не могут быть внедрены через @Autowiredпотому что сопоставление типов не относится к ним должным образом. использование @Resource для таких bean-компонентов - ссылка на конкретный bean-компонент коллекции или карты с уникальным именем.

см.: bean-свойство-свойство-не-установка-от-объекта-объекта

и весенний док

Другие вопросы по тегам