При использовании 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
, этот атрибут не нужен.