【问题标题】:Spring Controller Injected Properties Turn NullSpring 控制器注入的属性变为空
【发布时间】:2013-10-23 16:47:41
【问题描述】:

我的情况和“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:

    <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>

然后@Autowireing 依赖项

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

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

【问题讨论】:

    标签: java spring spring-mvc spring-ioc


    【解决方案1】:

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

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

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

    【讨论】:

    • 是否可以声明Resource bean,然后我可以在带注释的控制器中使用@Autowire?
    • @benashby 当然是。选择您选择的Resource 实现,为它声明一个bean 并使用您想要的属性。然后@Autowired它。您可能想使用 @Qualified 来使用它的 id。
    • 是的,您可以将@Autowired 用于在 XML 中声明的 bean。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多