Spring Autowire原始布尔值

时间:2013-02-23 15:11:51

标签: java spring autowired

我的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:注入autowired   依赖失败;嵌套异常是   org.springframework.beans.factory.BeanCreationException:不能   autowire字段:protected boolean   staffing.server.action.form.AbstractFormAction.closed;嵌套   例外是   org.springframework.beans.factory.NoSuchBeanDefinitionException:没有   为依赖项找到匹配的[boolean]类型的bean:expect at   至少有1个bean有资格作为autowire候选者   依赖。依赖注释:   {@ org.springframework.beans.factory.annotation.Autowired(所需=真)}

似乎抱怨它无法找到一个字节boolean的bean。但是,为什么在按值定义属性“关闭”而不是通过引用时,它是否需要bean?

3 个答案:

答案 0 :(得分:4)

您需要使用@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;

如果您可以使用component-scan,则甚至无需指定创建bean

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

答案 1 :(得分:0)

您不应使用closed@Autowired进行注释。

@Autowired指示Spring在你的上下文中查找一个autowired字段(boolean)类型的bean,这就是为什么它抱怨“没有类型[boolean]匹配的bean”

如果从xml config注入值,则不需要在该字段上添加任何注释。

答案 2 :(得分:0)

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

Declaring Spring Bean in Parent Context vs Child Context

Spring XML file configuration hierarchy help/explanation

Spring-MVC: What are a "context" and "namespace"?

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