2011-09-02 12 views
5

Spring Beanにファイルリソースを注入する良い方法はありますか? 私はServletContextをautowireし、以下のように使います。 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

何か。

このテクニックを使用してコントローラを検出するためにコンポーネントスキャンを使用することはできません。明示的な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> 

春は、あなたのリソースバンドルあなたのアプリケーションが起動をロードします。次に、あなたのコントローラにMessageSourceをautowireし、ローカライズされたメッセージを得るためにそれを使用することができます:

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

- ちょうどクリーナーようだが。あなたのBean定義で

@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 id="..." class="x.y.SomeController"> 
    <property name="resource" value="/WEB-INF/file.txt"/> 
</bean> 

これは/WEB-INF/file.txtパスを使用してServletContextResourceを作成し、あなたのコントローラにそれを注入します。このような

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