1

我的 XML 配置包括这些 bean 定义:

<bean id="abstractFormAction" class="staffing.server.action.form.AbstractFormAction" abstract="true" parent="baseAction">
    <property name="volunteerSaver" ref="volunteerSaver"/>
    <property name="emailSender" ref="emailSender"/> 
    <property name="closed" value="${form.closed}"/>
</bean>

<bean id="volunteerFormAction" class="staffing.server.action.form.VolunteerFormAction" parent="abstractFormAction">
    <property name="captchaGenerator" ref="captcha"/>
</bean>

表示VolunteerFormAction是AbstactFormAction的具体实现,会继承AbstactFormAction的属性。

在 AbstractFormAction 中,我声明如下属性:

@Autowired protected VolunteerSaver volunteerSaver;
@Autowired protected EmailSender emailSender;
@Autowired protected boolean closed;

尝试部署时出现以下异常:

org.springframework.beans.factory.BeanCreationException:创建名为“volunteerFormAction”的bean时出错:注入自动装配的依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:受保护的布尔staffing.server.action.form.AbstractFormAction.closed;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为 [boolean] 的匹配 bean:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)}

似乎在抱怨它找不到字节布尔值的 bean。但是,当通过值而不是引用定义属性“关闭”时,为什么它会想要一个 bean?

4

3 回答 3

5

您需要使用@Value注释来使用属性占位符传递值。@Autowire 期望指定类型的 bean 出现在 applicationContext 中。

如果要自动装配值,为什么要将值传递到 bean 定义中?我想你需要的是

<bean id="abstractFormAction" class="staffing.server.action.form.AbstractFormAction" abstract="true" parent="baseAction"><bean>
<bean id="volunteerFormAction" class="staffing.server.action.form.VolunteerFormAction" parent="abstractFormAction">
    <property name="captchaGenerator" ref="captcha"/>
</bean>

@Autowired protected VolunteerSaver volunteerSaver;
@Autowired protected EmailSender emailSender;
@Value("#{form.closed}") protected boolean closed;

如果您可以使用组件扫描,您甚至不需要指定创建 bean

您可以添加<context:component-scan base-package="<your base package>"/>到您的 context.xml 文件并将注释添加@Controller到您的控制器文件

于 2013-02-23T15:17:00.733 回答
0

你不应该closed@Autowired.

@Autowired指示 Spring 在您的上下文中查找自动装配字段(布尔)类型的 bean,这就是为什么它抱怨“没有匹配类型的 bean [boolean]”

如果您从 xml 配置中注入值,则不需要对该字段进行任何注释。

于 2013-02-23T15:15:43.600 回答
0

根据您显示的代码,您加载 Spring 上下文的方式可能存在问题。我的猜测是,您在根 Web 应用程序上下文和控制器应该存在的子上下文中都错误地对控制器进行了组件扫描。这意味着创建了这个类的两个实例,并且只有一个是通过 XML 配置的。Spring 正在尝试自动装配另一个实例并因给定错误而失败。您将在其他几个 SO 答案中找到问题和解决方案的描述,如下所示:

在父上下文与子上下文中声明 Spring Bean

Spring XML 文件配置层次结构帮助/说明

Spring-MVC:什么是“上下文”和“命名空间”?

如果您提供有关配置文件和上下文配置的更多详细信息,那么有人可能会准确指出您出错的地方。

于 2013-02-23T16:03:07.633 回答