2011-09-20 15 views
27

En mi aplicación Spring 3.0, tengo algunos recursos en /WEB-INF/dir. En tiempo de ejecución necesito algunos de ellos como InputStream (o algún otro tipo). ¿Cómo puedo recuperarlos? ¿Es posible inyectarlos como un Resource normal?Spring 3.0 inyecte archivos como recursos

Respuesta

54

Aquí es una forma más fácil de hacerlo a través de la anotación:

import org.springframework.core.io.Resource; 

@Value("classpath:<path to file>") 
private Resource cert; 
+0

¡Eso es genial! – Kong

+1

¿Alguna idea sobre cómo se puede cargar un directorio? Por ejemplo, un directorio "dir" que contiene 25 archivos –

+0

Eso es genial, pero puede no funcionar dentro del archivo jar. –

2

Usted debe ser capaz de usar:

Resource resource = appContext.getResource("classpath:<your resource name>"); 
InputStream is = resource.getInputStream(); 

donde appContext es su primavera ApplicationContext (específicamente, un WebApplicationContext, ya que tiene una aplicación web)

+0

El ' La interfaz de Resource no declara un método 'getInputStream()', necesitarías llamar 'new FileInputStream (resource.getFile())'. –

+0

Eso es incorrecto. 'Resource' lo hereda de la interfaz' org.springframework.core.io.InputStreamSource' – Saket

+0

Lo siento, lo siento, no vi los 'implements'. –

-1

Si no desea introducir la dependencia de la primavera , siga el enfoque detallado aquí: Populate Spring Bean's File field via Annotation

+0

No veo cómo alguna de las respuestas a esa pregunta da como resultado una dependencia reducida en Spring ... –

+0

Acepto que usar @Value no es una dependencia cero de primavera. –

+1

Pero las anotaciones son la mejor manera de lograr la inyección de resorte sin violar el principio de no repetir. El enfoque XML que recomiendas te obliga a repetirte. Tarde o temprano, alguien va a cambiar el nombre de la propiedad en el archivo java y olvidará actualizar el archivo de definición de Spring Bean. –

5

Todos ApplicationContext s son, por definición, ResourceLoader s. Esto significa que son capaces de resolver cualquier cadena de recursos encontrada dentro de su configuración. Con esto en mente, puede declarar su bean objetivo con un colocador que acepte un org.springframework.core.io.Resource. Luego, cuando configure el bean objetivo, solo use una ruta de recursos en el valor de la propiedad. Spring intentará convertir el valor String en su configuración en Resource.

public class Target { 
    private Resource resource; 
    public void setResource(final Resource resource) { 
    this.resource = resource; 
    } 
} 

//configuration 
<beans> 
    <bean id="target" class="Target"> 
    <property name="resource" value="classpath:path/to/file"/> 
    </bean> 
</beans> 
1

Aquí hay un ejemplo completo para recuperar un recurso de ruta de clase. Yo lo uso para agarrar los archivos SQL que tienen consultas muy complejas que no desea almacenar en las clases de Java:

public String getSqlFileContents(String fileName) { 
    StringBuffer sb = new StringBuffer(); 
    try { 
     Resource resource = new ClassPathResource(fileName); 
     DataInputStream in = new DataInputStream(resource.getInputStream()); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
     String strLine; 
     while ((strLine = br.readLine()) != null) { 
      sb.append(" " + strLine); 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return sb.toString(); 
} 
Cuestiones relacionadas