2011-09-02 15 views
5

Qual è un buon modo per iniettare qualche risorsa file nel bean Spring? Ora autowire ServletContext e uso come di seguito. È un modo più elegante per farlo in Spring MVC?Inietta una risorsa file nel bean Spring

@Controller 
public class SomeController { 

    @Autowired 
    private ServletContext servletContext; 

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

risposta

5

Qualcosa di simile a questo:

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

nella definizione di fagioli:

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

Questo creerà un ServletContextResource utilizzando il percorso /WEB-INF/file.txt, e iniettare che nel controller.

Nota: non è possibile utilizzare la scansione dei componenti per rilevare il controller utilizzando questa tecnica, è necessaria una definizione di bean esplicita.

1

Per che cosa si intende utilizzare la risorsa? Nell'esempio tu non fai niente con esso.

Dal suo nome, tuttavia, sembra che si stia tentando di caricare messaggi di internazionalizzazione/localizzazione, per i quali è possibile un MessageSource.

Se si definiscono alcuni fagioli (possibilmente in un separato messages-context.xml) simile a questo:

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

Primavera sarà caricare il pacchetto di risorse quando voi l'applicazione si avvia. È quindi possibile autowire la MessageSource nel vostro controller e usarla per ottenere messaggi localizzati:

@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. aggiungendo Locale come parametro al metodo del controller, Spring lo collegherà magicamente - tutto ciò che è necessario fare.

È inoltre possibile quindi accedere ai messaggi nella resource bundle in JSP utilizzando:

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

che è il mio modo preferito per farlo - solo sembra più pulito.

+0

lo so MessageSource. 'messages_en.properties' è solo un esempio. Ho cambiato questo per evitare errori. – marioosh

+0

Ah, ok. Beh suppongo che dipenda da cosa utilizzerai il file. Se è qualcosa di abbastanza standard come un file .properties o L18n, molto probabilmente ci sarà un modo più ordinato per farlo (come il messaggio Source) ma se stai usando i file in un modo specifico, specifico, non vedo un problema con quello che stai facendo. – Russell

0

Oppure utilizzare l'annotazione @Value.

per singolo file:

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

Per più file:

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