2012-03-02 10 views
11

Chciałbym pobrać plik xml z mojej ścieżki klasy, aby usunąć błąd i użyć go do celów testowych. Moim problemem jest pobranie go jako InputStream. Napisałem te linie, ale zawsze otrzymuję wynik zerowy.Załaduj plik (xml) ze ścieżki klas w aplikacji internetowej wiosennej

Oczywiście ścieżka, którą widzisz w metodzie argumentu, jest tą, która znajduje się w moim pliku. Próbowałem kilka kombinacji:

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

ale zawsze uzyskać InputStream = null.

Próbowałem nawet przełączyć się

ClassLoader.getResourceAsStream(...) 

ale nic się nie dzieje. Przypuszczam, że ścieżka do zasobu jest w jakiś sposób błędna, ale nie wiem, gdzie. Z mojego servlet.xml używam jakiegoś zasobu w ścieżce klasy konfiguracyjnym PropertyPlaceholderConfigurer lub Jaxb2Marshaller tylko ze składnią

"classpath:folder/file.xsd" 

i działa idealnie. Folder, z którego chcę załadować mój xml, jest rodzajem siostry z powyższego przykładu. Czego mi brakuje?

EDIT: staram się postępować zgodnie z podejściem wiosna ClassPathResource klasy pomocnika i otrzymuję dziwne zachowanie: jak już mówiłem mam już pewne zasoby ładowane od ścieżki klasy przez niektórych ziaren wiosennych przy starcie. Jeśli używam ścieżkę do takich zasobów w kodzie sugerowanej przez Dardo w sposób następujący:

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

I jeszcze dostać FileNotFound Exception! Oczywiście "xmlschemas/lrinode.xsd" jest XSD ładowane przy starcie pomyślnie. Nie działa, nawet jeśli używam pełnej ścieżki do zasobu, zaczynając od katalogu głównego aplikacji.

Zaczynam myśleć, że brakuje mi czegoś trywialnego.

Odpowiedz

21

Wiosna zapewnia klasę pomocniczą o nazwie ClassPathResource

Więc coś takiego:

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

powinny działać, mam nadzieję, że to pomaga!

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

Sidenote

Ponadto, jeśli używasz go do celów testowych, może chcesz podłączyć fasoli odwzorowaną do XSD.

chcieć zajrzeć do naziemnego JAXB

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

+0

dzięki, jestem zainteresowany tą klasą pomocników. Próbowałem Twojego rozwiązania, ale nadal dostaję '" java.io.FileNotFoundException: zasób ścieżki klasy [testing/sample_complete_document.xml] nie może zostać otwarty, ponieważ nie istnieje wyjątek "' . Nazwa pliku jest rzeczywistą nazwą pliku w mojej ścieżce klas. PS. Już używam JAXB2^_^ – MaVVamaldo

+0

Co oznacza pełna ścieżka, jeśli dokument xml – dardo

+0

pełna ścieżka dokumentu xml jest następująca: '/ VirtualResource2/WebContent/WEB-INF/classes/testing/sample_complete_document.xml'. Oczywiście "VirtualResource2" to nazwa mojej aplikacji internetowej. – MaVVamaldo

3

Trzeba kombinacji ty nie spróbować:

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

Katalog WebContent/WEB-INF/classes powinna być już na ścieżce klasy.

Składnia classpath: działa tylko jeśli używasz Wiosny ResourceLoader abstrakcji, które nie są. Twoje użycie classpath:folder/file.xsd w twoich modelach classpath:folder/file.xsd, ponieważ Spring przekazuje je przez ServletContextResourceLoader, który automatycznie rozwiązuje classpath:.

+0

dziękuję za wyjaśnienie, teraz mgła jest rozliczającego. Pechowo ani proponowane przez ciebie rozwiązanie nie działa w moim projekcie. Przypuszczam, że katalog "classes" znajduje się w ścieżce klas, ponieważ znajduje się on za pomocą składni "classpath:" działającej w kontekście wiosny, prawda? Uh ... ok, przyznaję to. Nie jestem pewien, czym jest exaslty classpath. Bardzo wstyd powiedzieć. Zakładam, że jest to wszystko, co widzę z korzenia mojego projektu zaćmienia w eksploratorze pakietów. Wiem, że jest to zmienna, ale myślę, że zaćmienie będzie zarządzać nią automatycznie ... – MaVVamaldo

+0

@maVVamaldo: Upewnij się, że zawierasz wiodący ukośnik na ścieżce. Dodałem, że kilka sekund po mojej pierwszej odpowiedzi. – skaffman

+0

ze względu na kompletność, jest to dokładny fragment kodu, który próbowałem. InputStream is = getClass(). GetResourceAsStream ("/ testing /" + COMPLETE_DOCUMENT + ".xml"); – MaVVamaldo

0

Po wywołaniu Class.getResourceAsStream() z nazwą zasobu bez ukośnika wiodącego przyjmuje się, że żądasz zasobu względem bieżącego pakietu (tj. Pakietu klasy dzwoniących). Aby uczynić ją bezwzględną ścieżką zasobu, musisz dodać wiodący ukośnik do nazwy zasobu, np.w przypadku "/testing/"+ COMPLETE_DOCUMENT + ".xml"

Powiązane problemy