无法在spring中注入请求范围的bean

时间:2013-04-29 12:17:08

标签: java spring

所以我有这个bean用于数据库管理。我用以下方式定义它:

<bean id="dbmanager" class="rpg.commons.database.DBManager" scope="request"/>

然后我尝试将其放入控制器

@Controller
public abstract class AbstractController {

@EJB
protected DBManager dbmanager;

    ...
}

我也试过@Autowired,但在每种情况下,当我尝试在我的glassfish服务器上部署它时,我得到以下异常

java.lang.Exception: java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'homePageController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected rpg.commons.database.DBManager rpg.web.controllers.AbstractController.dbmanager; nested exception is java.lang.UnsupportedOperationException

homePageController是一个简单的控制器,它继承了我的AbstractController。 我也尝试将该字段更改为公开,但它没有改变任何内容......

2 个答案:

答案 0 :(得分:2)

您不能直接将请求范围的bean注入单例,而是注入请求范围的代理:

<bean id="dbmanager" class="rpg.commons.database.DBManager" scope="request">
  <aop:scoped-proxy/>
</bean>

请参阅http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/beans.html#beans-factory-scopes-other-injection

答案 1 :(得分:1)

@EJB是一个用于注入的注释,你期望的...... EJB。因为你的bean不是一个当然不会起作用的EJB。以下是使用Spring处理依赖注入的两种方法:

通过xml注入

<bean id="dbmanager" class="rpg.commons.database.DBManager" scope="request"/>
<bean id="abstractController" class="rpg.commons.database.AbstractController">
    <property name="dbmanager" ref="dbmanager" />
</bean>

通过注释注入

Spring有@Autowired注释用于处理依赖注入,但你需要在xml中“打开”注释扫描:

<context:component-scan base-package="rpg.commons.database" />

然后以下构造将起作用:

@Autowired
protected DBManager dbmanager;