2011-09-02 17 views
5

Jaki jest dobry sposób na wstrzyknięcie jakiegoś zasobu plikowego do Spring bean? Teraz przeprogramowuję ServletContext i używam jak poniżej. Czy jest to bardziej elegancki sposób w Spring MVC?Wprowadzić zasób pliku do Spring bean

@Controller 
public class SomeController { 

    @Autowired 
    private ServletContext servletContext; 

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

Odpowiedz

5

coś takiego:

@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(); 
    } 
} 

W swojej definicji fasoli:

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

To stworzy ServletContextResource stosując ścieżkę /WEB-INF/file.txt i wstrzyknąć że w kontrolerze.

Uwaga: nie można użyć skanowania podzespołu do wykrycia kontrolera za pomocą tej techniki, potrzebna jest wyraźna definicja komponentu bean.

1

Do czego zamierzasz użyć zasobu? Na twoim przykładzie nic z tym nie robisz.

Z tej nazwy wygląda jednak na to, że próbujesz załadować wiadomości dotyczące internacjonalizacji/lokalizacji - dla których możesz MessageSource.

Jeśli zdefiniować kilka ziaren (ewentualnie w osobnym messages-context.xml) podobne do tego:

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

Wiosna będzie załadować pakiet zasobów podczas uruchamiania aplikacji. Można wtedy autowire się MessageSource do kontrolera i użyć go, aby uzyskać zlokalizowane komunikaty:

@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. dodanie Locale jako parametru do metody kontrolera spowoduje, że Spring będzie magicznie je podłączał - to wszystko, co musisz zrobić.

Można również wtedy dostęp do wiadomości w pakunku zasobów w swoim JSP przy użyciu:

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

Który jest mój preferowany sposób to zrobić - po prostu wydaje się czystsze.

+0

wiem MessageSource. "messages_en.properties" jest tylko przykładem. Zmieniłem to, aby uniknąć błędów. – marioosh

+0

Ah, ok. Cóż, myślę, że to zależy od tego, do czego zamierzasz użyć tego pliku. Jeśli jest to coś dość standardowego, jak plik .properties lub wiadomości L18n, najprawdopodobniej będzie to jakiś konkretny sposób na zrobienie tego (np. MessageSource), ale jeśli używasz plików w jakiś specjalnie dostosowany sposób, nie widzę problem z tym, co robisz. – Russell

0

Albo po prostu użyj adnotacji @Value.

Dla pojedynczego pliku:

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

Dla wielu plików:

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