2011-09-02 72 views
5

將某些文件資源注入Spring bean的好方法是什麼? 現在我autowire ServletContext和使用下面。 Spring MVC中更優雅的方法嗎?向Spring bean注入文件資源

@Controller 
public class SomeController { 

    @Autowired 
    private ServletContext servletContext; 

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

回答

5

事情是這樣的:

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

這將使用/WEB-INF/file.txt路徑創建ServletContextResource,並注入該到控制器中。

注意你不能使用組件掃描來檢測你的控制器使用這種技術,你需要一個明確的bean定義。

1

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

但是,從它的名稱看來,您似乎正試圖加載國際化/本地化消息 - 爲此您可以輸入MessageSource

如果你定義了一些豆子(可能在一個單獨的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" /> 

這是我的首選方式做到這一點 - 只是看起來更清潔。

+0

我知道的MessageSource。 'messages_en.properties'只是一個例子。我改變了這個以避免錯誤。 – marioosh

+0

啊,好的。那麼我想這取決於你要使用該文件。如果它像.properties文件或L18n消息那樣相當標準,那麼很可能會有一個特定的整潔方式(如messageSource),但是如果您以某種定製的特定方式使用這些文件,我看不到與你在做什麼有關的問題。 – Russell

0

或者只是使用@Value註釋。

對於單個文件:

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

對於多個文件:

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