【问题标题】:Spring Autowire primitive booleanSpring Autowire 原始布尔值
【发布时间】:2013-02-09 02:57:18
【问题描述】:

我的 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:不能 自动装配字段:受保护的布尔值 人员配备.server.action.form.AbstractFormAction.close;嵌套的 例外是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 为依赖找到了类型为 [boolean] 的匹配 bean:预期在 至少 1 个有资格作为自动装配候选者的 bean 依赖。依赖注解: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

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

【问题讨论】:

    标签: java spring autowired


    【解决方案1】:

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

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

    【讨论】:

    • 如果上下文设置正确,在 XML 中完全定义 bean 不会给出指示的错误,因为 Spring 会看到已经为该字段提供了一个值。
    【解决方案2】:

    您不应使用 @Autowired 注释 closed

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

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

    【讨论】:

      【解决方案3】:

      根据您显示的代码,您加载 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"?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-27
        • 1970-01-01
        • 2014-10-20
        • 2023-04-08
        • 2017-09-27
        • 1970-01-01
        • 2013-09-16
        相关资源
        最近更新 更多