2012-03-02 3 views
11

Me gustaría tomar un archivo xml de mi classpath para descomponerlo y usarlo con fines de prueba. Mi problema es obtenerlo como un InputStream. Escribí estas líneas, pero siempre obtengo un resultado nulo.carga un archivo (xml) desde el classpath en una aplicación web de primavera

InputStream is = getClass().getResourceAsStream("WebContent/WEB-INF/classes/testing/"+ COMPLETE_DOCUMENT + ".xml"); 

Por supuesto, la ruta que ve en el argumento del método es la de mi archivo. He intentado varias combinaciones:

WebContent/WEB-INF/classes/testing/ 
classpath:testing/ 
classpath*:testing/ 

pero siempre me sale el InputStream = null.

Incluso he intentado cambiar a

ClassLoader.getResourceAsStream(...) 

pero no pasa nada. Supongo que el camino hacia el recurso es incorrecto, pero no sé dónde. Desde mi servlet.xml: Consumo de recursos en la ruta de clase configurar PropertyPlaceholderConfigurer o Jaxb2Marshaller acaba con la sintaxis

"classpath:folder/file.xsd" 

y funciona perfectamente. La carpeta de la que quiero cargar mi xml es una hermana de la del ejemplo anterior. ¿Qué me estoy perdiendo?

EDIT: trato de seguir el enfoque de clase de ayuda ClassPathResource primavera y me siento un comportamiento extraño: como he dicho antes ya tengo algunos recursos cargados desde la ruta de clase por parte de algunos granos de primavera en la puesta en marcha. Si utilizo el camino a tales recursos en el código sugerido por dardo de la siguiente manera:

ClassPathResource cpr = new ClassPathResource("xmlschemas/lrinode.xsd"); 
InputStream is = cpr.getInputStream(); 

todavía consigo un FileNotFound Exception! Por supuesto "xmlschemas/lrinode.xsd" es un xsd que cargué al inicio con éxito. No funciona incluso si utilizo la ruta completa al recurso, comenzando desde la raíz de la aplicación.

Estoy empezando a pensar que me estoy perdiendo algo trivial.

Respuesta

21

Spring proporciona una clase de ayuda nombrado ClassPathResource

Así que algo como:

ClassPathResource cpr = new ClassPathResource("folder/file.xsd"); 
InputStream is = cpr.getInputStream(); 

debe trabajar, espero que esto ayude!

Enlace a la API Doc: http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/core/io/ClassPathResource.html

Nota al margen

Además, si usted lo está utilizando para fines de prueba, puede ser que desee conectar un grano asignada a la xsd.

posible que desee ver en un contador de referencias JAXB

http://static.springsource.org/spring-ws/site/reference/html/oxm.html#oxm-jaxb2-xsd

+0

gracias, estoy interesado en esta clase de ayuda. Intenté su solución, pero sigo recibiendo '" java.io.FileNotFoundException: class path resource [testing/sample_complete_document.xml] no se puede abrir porque no existe "' excepción. El nombre del archivo es el nombre real del archivo en mi classpath. PS. Ya uso JAXB2^__^ – MaVVamaldo

+0

Cuál es la ruta completa si el documento xml – dardo

+0

el camino completo del documento xml es el siguiente: '/ VirtualResource2/WebContent/WEB-INF/classes/testing/sample_complete_document.xml'. Por supuesto, "VirtualResource2" es el nombre de mi aplicación web. – MaVVamaldo

3

Se necesita una combinación que no intenta:

getClass().getResourceAsStream("/testing/"+ COMPLETE_DOCUMENT + ".xml"); 

El directorio WebContent/WEB-INF/classes ya debería estar en la ruta de clase.

La sintaxis classpath: solo funciona si está utilizando la abstracción de Spring ResourceLoader, que no es. Su uso de classpath:folder/file.xsd en su servlet.xml woprks porque Spring lo pasa a través de ServletContextResourceLoader, que resuelve classpath: automáticamente.

+0

gracias por su explicación, ahora la niebla se despeja. Desafortunadamente, ni la solución que sugieres funciona en mi proyecto. Supongo que el directorio "classes" está en el classpath ya que está ubicado por la sintaxis "classpath:" trabajando para el contexto de primavera, ¿verdad? Uh ... vale, lo admito. No estoy seguro de lo que es una excentricidad de clase. Muy embarazoso de decir. Supongo que es todo lo que puedo ver desde la raíz de mi proyecto de eclipse en el explorador de paquetes. Sé que es una variable, pero creo que eclipse lo gestionaría automáticamente ... – MaVVamaldo

+0

@maVVamaldo: Asegúrese de incluir la barra inicial en la ruta. Lo agregué unos segundos después de mi respuesta inicial. – skaffman

+0

para completar, este es el fragmento exacto de código que probé. InputStream is = getClass(). GetResourceAsStream ("/ testing /" + COMPLETE_DOCUMENT + ".xml"); – MaVVamaldo

0

Cuando llama al Class.getResourceAsStream() con el nombre del recurso sin barra diagonal inicial, supone que está solicitando un recurso relativo a un paquete actual (es decir, el paquete de la clase de llamante). Para que sea una ruta de recursos absoluta, debe agregar una barra diagonal a un nombre de recurso, p.en su caso "/testing/"+ COMPLETE_DOCUMENT + ".xml"

Cuestiones relacionadas