проблема в бобе области действия Spring с AOP - PullRequest
3 голосов
/ 23 декабря 2009

Я хочу добавить экземпляр currentUser в класс HomeController. поэтому для каждого запроса HomeController будет иметь объект currentUser.

Моя конфигурация:

<bean id="homeController" class="com.xxxxx.actions.HomeController">
    <property name="serviceExecutor" ref="serviceExecutorApi"/>
    <property name="currentUser" ref="currentUser"/>
</bean>

<bean id="userProviderFactoryBean" class="com.xxxxx.UserProvider">
    <property name="userDao" ref="userDao"/>
</bean>

<bean id="currentUser" factory-bean="userProviderFactoryBean" scope="session">
    <aop:scoped-proxy/>
</bean>

Но я получаю следующую ошибку.

Caused by: java.lang.IllegalStateException: Cannot create scoped proxy for bean 'scopedTarget.currentUser': Target type could not be determined at the time of proxy creation.
        at org.springframework.aop.scope.ScopedProxyFactoryBean.setBeanFactory(ScopedProxyFactoryBean.java:94)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1350)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:540)

В чем проблема? и есть ли лучшая / простая альтернатива?

Приветствие.

1 Ответ

4 голосов
/ 23 декабря 2009

При использовании scoped-прокси Spring по-прежнему необходимо знать тип компонента при инициализации контекста, и в этом случае он этого не делает. Вы должны попытаться дать ему больше информации.

Я заметил, что вы указываете factory-bean в своем определении currentUser, без указания factory-method. Я на самом деле довольно удивлен, что это правильное определение, так как оба обычно используются вместе. Поэтому попробуйте добавить атрибут factory-method к currentUser, который указывает метод на userProviderFactoryBean, который создает пользовательский компонент. Этот метод должен иметь возвращаемый тип вашего класса User, который Spring будет использовать для вывода типа currentUser.


Редактировать: ОК, после вашего комментария ниже, вы, кажется, неправильно поняли, как использовать фабричные bean-компоненты в Spring. Если у вас есть компонент типа FactoryBean, вам не нужно также использовать атрибут factory-bean. Так что вместо этого:

<bean id="userProviderFactoryBean" class="com.xxxxx.UserProvider">
    <property name="userDao" ref="userDao"/>
</bean>

<bean id="currentUser" factory-bean="userProviderFactoryBean" scope="session">
    <aop:scoped-proxy/>
</bean>

Вам просто нужно это:

<bean id="currentUser" class="com.xxxxx.UserProvider" scope="session">
    <aop:scoped-proxy/>
    <property name="userDao" ref="userDao"/>
</bean>

Здесь UserProvider - это FactoryBean, и Spring знает, как с этим справиться. Конечным результатом будет то, что бин currentUser будет генерировать UserProvider, а не сам экземпляр UserProvider.

Атрибут factory-bean используется, когда фабрика является не реализацией FactoryBean, а просто POJO, и она позволяет вам явно сказать Spring, как использовать фабрику. Но поскольку вы используете FactoryBean, этот атрибут не нужен.

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