所以我有这个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。 我也尝试将该字段更改为公开,但它没有改变任何内容......
答案 0 :(得分:2)
您不能直接将请求范围的bean注入单例,而是注入请求范围的代理:
<bean id="dbmanager" class="rpg.commons.database.DBManager" scope="request">
<aop:scoped-proxy/>
</bean>
答案 1 :(得分:1)
@EJB是一个用于注入的注释,你期望的...... EJB。因为你的bean不是一个当然不会起作用的EJB。以下是使用Spring处理依赖注入的两种方法:
<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;