将文件资源注入Spring bean

时间:2011-09-02 06:54:10

标签: spring spring-mvc

将一些文件资源注入Spring bean的好方法是什么? 现在我自动装配ServletContext并使用如下所示。在Spring MVC中更优雅的方式吗?

@Controller
public class SomeController {

    @Autowired
    private ServletContext servletContext;

    @RequestMapping("/texts")
    public ModelAndView texts() {
        InputStream in = servletContext.getResourceAsStream("/WEB-INF/file.txt");
        // ...
    }
}

3 个答案:

答案 0 :(得分:6)

这样的事情:

@Controller
public class SomeController {

    private Resource resource;

    public void setResource(Resource resource) {
        this.resource = resource;
    }

    @RequestMapping("/texts")
    public ModelAndView texts() {
        InputStream in = resource.getInputStream();
        // ...
        in.close();
    }
}

在你的bean定义中:

<bean id="..." class="x.y.SomeController">
   <property name="resource" value="/WEB-INF/file.txt"/>
</bean>

这将使用ServletContextResource路径创建/WEB-INF/file.txt,并将其注入您的控制器。

请注意,您无法使用组件扫描来检测使用此技术的控制器,您需要一个明确的bean定义。

答案 1 :(得分:1)

您打算如何使用该资源?在你的例子中,你不做任何事情。

从它的名字来看,您似乎正在尝试加载国际化/本地化消息 - 您可以MessageSource

如果您定义了一些类似于此的bean(可能在单独的messages-context.xml中):

<bean id="messageSource"
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basenames">
        <list>
            <value>WEB-INF/messages/messages</value>
        </list>
    </property>
</bean>

<bean id="localeChangeInterceptor"
    class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <property name="paramName" value="lang" />
</bean>

<bean id="localeResolver"
    class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <property name="defaultLocale" value="en_GB" />
</bean>

Spring将在应用程序启动时加载资源包。然后,您可以将MessageSource自动装入控制器并使用它来获取本地化消息:

@Controller
public class SomeController {

    @Autowired
    private MessageSource messageSource;

    @RequestMapping("/texts")
    public ModelAndView texts(Locale locale) {
        String localisedMessage = messageSource.getMessage("my.message.key", new Object[]{}, locale)
        /* do something with localised message here */
        return new ModelAndView("texts");
    }
}

NB。将Locale作为参数添加到控制器方法将导致Spring神奇地将其连接到 - 这就是你需要做的全部。

然后,您还可以使用以下命令访问JSP中资源包中的消息:

<spring:message code="my.message.key" />

这是我喜欢的方式 - 看起来更干净。

答案 2 :(得分:1)

或者只使用@Value注释。

对于单个文件:

@Value("classpath:conf/about.xml")
private Resource about;

对于多个文件:

@Value("classpath*:conf/about.*")
private Resource[] abouts;
相关问题