2011-09-02 16 views
5

¿Cuál es una buena forma de inyectar algún recurso de archivo en Spring bean? Ahora conecto automáticamente ServletContext y lo uso a continuación. ¿Es la manera más elegante de hacer eso en Spring MVC?Inyectar un recurso de archivo en Spring bean

@Controller 
public class SomeController { 

    @Autowired 
    private ServletContext servletContext; 

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

Respuesta

5

Algo como esto:

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

En su definición de frijol:

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

Esto creará un ServletContextResource utilizando la ruta /WEB-INF/file.txt, e inyectar eso en su controlador.

Tenga en cuenta que no puede usar el escaneo de componentes para detectar su controlador utilizando esta técnica, necesita una definición de bean explícita.

1

¿Para qué piensa utilizar el recurso? En tu ejemplo, no haces nada con eso.

Desde su nombre, sin embargo, parece que está intentando cargar mensajes de internacionalización/localización, para lo cual puede obtener MessageSource.

Si se define un poco de frijoles (posiblemente en una separada messages-context.xml) similar a esto:

<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 se cargará el paquete de recursos cuando se inicia la aplicación. A continuación, puede Autowire la MessageSource en el controlador y utilizarlo para obtener los mensajes localizados:

@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. Agregar Locale como parámetro al método de su controlador causará que Spring lo conecte mágicamente, eso es todo lo que tiene que hacer.

También puede entonces tener acceso a los mensajes en su paquete de recursos en las JSP usando:

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

Cuál es mi forma preferida de hacerlo - sólo parece más limpio.

+0

Sé MessageSource. 'messages_en.properties' es solo un ejemplo. Cambié esto para evitar errores. – marioosh

+0

Ah, vale. Bueno, supongo que depende para qué vas a usar el archivo. Si es algo bastante estándar como un archivo .properties o mensajes L18n, lo más probable es que haya una forma más clara de hacerlo (como el messageSource), pero si está utilizando los archivos de alguna manera personalizada, específica, no veo una problema con lo que estás haciendo. – Russell

0

O simplemente use la anotación @Value.

Para una sola fila:

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

Para varios archivos:

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