2012-03-02 8 views
11

Vorrei portare un file xml dal mio classpath a unmarshal e usarlo a scopo di test. Il mio problema è di averlo come InputStream. Ho scritto queste righe ma ottengo sempre un risultato nullo.carica un file (xml) dal classpath in un'app web di primavera

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

ovviamente il percorso che vedi nell'argomento metodo è quello del mio file. Ho provato diverse combinazioni:

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

ma ho sempre ottenere l'InputStream = null.

Ho anche cercato di passare a

ClassLoader.getResourceAsStream(...) 

ma non succede nulla. Suppongo che il percorso verso la risorsa sia in qualche modo sbagliato, ma non riesco a capire dove. Dal mio servlet.xml Faccio uso di alcune risorse nel classpath configurazione PropertyPlaceholderConfigurer o Jaxb2Marshaller solo con la sintassi

"classpath:folder/file.xsd" 

e funziona perfettamente. La cartella che voglio caricare il mio xml da è un fratello di quello nell'esempio sopra. Cosa mi manca?

EDIT: cerco di seguire l'approccio classe helper primavera ClassPathResource e ottengo uno strano comportamento: come ho detto prima ho già alcune risorse caricate dal classpath da alcuni fagioli di primavera all'avvio. Se uso il percorso di tali risorse nel codice suggerito da Dardo nel modo seguente:

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

ho ancora ottenere un FileNotFound Exception! Ovviamente "xmlschemas/lrinode.xsd" è un xsd che carico all'avvio con successo. Non funziona anche se utilizzo il percorso completo della risorsa, a partire dalla radice dell'applicazione.

Sto iniziando a pensare che mi manca qualcosa di banale.

risposta

21

Primavera offre una classe di supporto di nome ClassPathResource

Quindi qualcosa di simile:

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

dovrebbe funzionare, spero che questo aiuta!

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

Sidenote

Inoltre, se lo si usa a scopo di test, potrebbe desiderare di cablare un fagiolo mappato al XSD.

potrebbe voler guardare in un marshaller JAXB

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

+0

grazie, sono interessato a questa classe di supporto. Ho provato la tua soluzione ma ottengo ancora '" java.io.FileNotFoundException: risorsa percorso classe [testing/sample_complete_document.xml] non può essere aperto perché non esiste " eccezione. Il nome del file è il nome effettivo del file nel mio classpath. PS. Utilizzo già JAXB2^__^ – MaVVamaldo

+0

Qual è il percorso completo se il documento xml – dardo

+0

il percorso completo del documento xml è il seguente: '/ VirtualResource2/WebContent/WEB-INF/classes/testing/sample_complete_document.xml'. Naturalmente "VirtualResource2" è il nome della mia applicazione web. – MaVVamaldo

3

Avete bisogno di una combinazione non hai provato:

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

La directory WebContent/WEB-INF/classes dovrebbe già essere nel classpath.

La sintassi classpath: funziona solo se si utilizza l'astrazione di Spring ResourceLoader, che non si è. L'utilizzo di classpath:folder/file.xsd nelle tue servlet.xml woprks perché Spring lo sta passando attraverso un ServletContextResourceLoader, che risolve automaticamente classpath:.

+0

grazie per la tua spiegazione, ora la nebbia è di compensazione. Sfortunatamente né la soluzione che suggerisci funziona nel mio progetto. Suppongo che la directory "classes" si trovi nel classpath poiché si trova nella sintassi "classpath:" che funziona per il contesto di primavera, giusto? Uh ... ok, lo ammetto. Non sono sicuro di quale sia l'esattezza del percorso di classe. Molto imbarazzante da dire. Presumo che sia tutto ciò che posso vedere dalla radice del mio progetto eclipse in explorer del pacchetto. So che è una variabile, ma penso che Eclipse lo gestirà automaticamente ... – MaVVamaldo

+0

@maVVamaldo: Assicurati di includere la barra iniziale nel percorso. L'ho aggiunto qualche secondo dopo la mia risposta iniziale. – skaffman

+0

per completezza, questo è l'esatto frammento di codice che ho provato. InputStream is = getClass(). GetResourceAsStream ("/ testing /" + COMPLETE_DOCUMENT + ".xml"); – MaVVamaldo

0

Quando si chiama Class.getResourceAsStream() con il nome della risorsa senza barra iniziale, si presuppone che si stia richiedendo la risorsa relativa a un pacchetto corrente (ovvero il pacchetto della classe chiamante). Per renderlo un percorso di risorse assoluto è necessario aggiungere la barra iniziale al nome della risorsa, ad es.nel tuo caso "/testing/"+ COMPLETE_DOCUMENT + ".xml"