弹簧控制器注入属性变为空

时间:2013-10-23 16:47:42

标签: java spring spring-mvc spring-ioc

我的情况非常类似于“Inject a file resource into Spring bean

我有一个使用一些.jasper编译文件的控制器,我将它们声明为

//...
@Controller
public class InvoicingController {

private Resource quoteTemplate;
...//

在我的上下文配置文件

<bean id="invoicingController" class="x.x.InvoicingController">
    <property name="quoteTemplate" value="/WEB-INF/jasper/Quote.jasper" />
...

我在setQuoteTemplate()函数上设置了一个断点,并且在初始化容器时正在调用它并正确设置Resource对象。但是当我实际点击控制器时quoteTemplate为空。

我理解控制器是单例,除非我的理解存在差距,否则当我点击控制器处理的url时,我不确定为什么在容器初始化期间设置的值变为null。

编辑:

感谢@Sotirios Delimanolis

我最终宣布豆类为:

    <bean id="quoteFile" class="java.io.File">
        <constructor-arg value="resources/jasper/Quote.jasper" />
    </bean>

    <bean id="quoteTemplate" class="org.springframework.core.io.FileSystemResource">
        <constructor-arg ref="quoteFile" />
    </bean>

然后@Autowire依赖性

@Autowired @Qualifier("quoteTemplate") private Resource quoteTemplate;
使用

@Qualifier是因为我有多个Resource实现类声明为bean,这样可以确保使用正确的类。

1 个答案:

答案 0 :(得分:4)

除非您没有@Controller,否则您不能同时使用<bean>注释和component-scan声明。最后将得到两个bean定义,其中最后一个将覆盖第一个bean。

在这种情况下,组件扫描bean定义似乎排在第二位,并用<bean>覆盖您创建的bean。

选择要使用的bean声明方法。