1

我的情况与“将文件资源注入 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 时变为空。

编辑:

谢谢@Sotirios Delimanolis

我最终这样声明 bean:

    <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像这样 ing 依赖项

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

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

4

1 回答 1

5

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

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

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

于 2013-10-23T16:55:03.233 回答