我的情况非常类似于“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,这样可以确保使用正确的类。
答案 0 :(得分:4)
除非您没有@Controller
,否则您不能同时使用<bean>
注释和component-scan
声明。最后将得到两个bean定义,其中最后一个将覆盖第一个bean。
在这种情况下,组件扫描bean定义似乎排在第二位,并用<bean>
覆盖您创建的bean。
选择要使用的bean声明方法。