1

所以我有这个 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。我也尝试将字段更改为公开,但它没有改变任何东西......

4

2 回答 2

2

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

<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

于 2013-04-29T12:32:27.823 回答
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;
于 2013-04-29T12:27:15.077 回答