2012-03-02 28 views
11

Tôi muốn lấy tệp xml từ đường dẫn lớp của tôi để loại bỏ nó và sử dụng nó cho mục đích thử nghiệm. Vấn đề của tôi là tải xuống dưới dạng InputStream. Tôi đã viết những dòng này nhưng tôi luôn nhận được kết quả rỗng.tải tệp (xml) từ đường dẫn lớp trong ứng dụng web mùa xuân

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

Tất nhiên đường dẫn bạn thấy trong đối số phương pháp là đường dẫn đến tệp của tôi. Tôi đã thử một số kết hợp:

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

nhưng tôi luôn nhận được InputStream = null.

Tôi thậm chí đã cố gắng để chuyển sang

ClassLoader.getResourceAsStream(...) 

nhưng có gì xảy ra. Tôi cho rằng đường dẫn đến tài nguyên là bằng cách nào đó sai, nhưng tôi không thể tìm ra nơi. Từ servlet.xml của tôi, tôi sử dụng một số tài nguyên trong classpath cấu hình PropertyPlaceholderConfigurer hoặc Jaxb2Marshaller chỉ với cú pháp

"classpath:folder/file.xsd" 

và nó hoạt động hoàn hảo. Thư mục tôi muốn tải xml của tôi từ là một anh chị em của một trong ví dụ trên. Tôi đang thiếu gì?

EDIT: tôi cố gắng làm theo các cách tiếp cận lớp helper mùa xuân ClassPathResource và tôi nhận được một hành vi kỳ lạ: như tôi đã nói trước khi tôi đã có một số tài nguyên được tải từ classpath bởi một số đậu mùa xuân ở lần khởi động. Nếu tôi sử dụng đường dẫn đến các tài nguyên như vậy trong mã do dardo đề xuất như sau:

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

Tôi vẫn nhận được FileNotFound Exception! Tất nhiên "xmlschemas/lrinode.xsd" là một xsd tôi tải khi khởi động thành công. Nó không hoạt động ngay cả khi tôi sử dụng đường dẫn đầy đủ đến tài nguyên, bắt đầu từ thư mục gốc của ứng dụng.

Tôi bắt đầu nghĩ rằng tôi thiếu một thứ gì đó tầm thường.

Trả lời

21

Spring cung cấp một lớp helper tên ClassPathResource

Vì vậy, một cái gì đó như:

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

nên làm việc, hy vọng điều này sẽ giúp!

Liên kết đến API Doc: http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/core/io/ClassPathResource.html

Sidenote

Ngoài ra, nếu bạn đang sử dụng nó cho mục đích thử nghiệm, có thể muốn để dây một bean ánh xạ tới các XSD.

Có thể muốn xem xét một marshaller JAXB

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

+0

cảm ơn, tôi quan tâm đến lớp trợ giúp này. Tôi đã thử giải pháp của bạn nhưng tôi vẫn nhận được '" java.io.FileNotFoundException: tài nguyên đường dẫn lớp [testing/sample_complete_document.xml] không thể mở được vì nó không tồn tại "' ngoại lệ. Tên tệp là tên thực tế cho tệp trong đường dẫn lớp của tôi. PS. Tôi đã sử dụng JAXB2^__^ – MaVVamaldo

+0

Whats đường dẫn đầy đủ nếu tài liệu xml – dardo

+0

đường dẫn đầy đủ của tài liệu xml như sau: '/ VirtualResource2/WebContent/WEB-INF/classes/testing/sample_complete_document.xml'. Khóa học "VirtualResource2" là tên của ứng dụng web của tôi. – MaVVamaldo

3

Bạn cần một kết hợp mà bạn không thử:

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

Thư mục WebContent/WEB-INF/classes nên đã được trên classpath.

Cú pháp classpath: chỉ hoạt động nếu bạn đang sử dụng trừu tượng ResourceLoader của Spring, mà bạn không sử dụng. Cách sử dụng của bạn là classpath:folder/file.xsd trong số servlet.xml woprks của bạn vì mùa xuân truyền qua một số ServletContextResourceLoader, tự động giải quyết classpath:.

+0

cảm ơn bạn đã giải thích của bạn, bây giờ sương mù được thanh toán bù trừ. Vô tình không phải là giải pháp bạn đề nghị làm việc trong dự án của tôi. Tôi cho rằng thư mục "classes" nằm trong classpath vì nó được đặt bởi cú pháp "classpath:" làm việc cho bối cảnh spring, phải không? Uh ... ok, tôi thừa nhận nó. Tôi không chắc chắn về một exaclty classpath là gì. Rất xấu hổ khi nói. Tôi cho rằng đó là tất cả những gì tôi có thể thấy từ thư mục gốc của dự án nhật thực của tôi trong trình thám hiểm gói. Tôi biết nó là một biến, nhưng tôi nghĩ rằng nhật thực sẽ quản lý nó tự động ... – MaVVamaldo

+0

@maVVamaldo: Hãy chắc chắn rằng bạn bao gồm dấu gạch chéo hàng đầu trong đường dẫn. Tôi đã thêm một vài giây sau câu trả lời đầu tiên của tôi. – skaffman

+0

vì mục đích hoàn chỉnh, đây là đoạn mã chính xác mà tôi đã thử. InputStream là = getClass(). GetResourceAsStream ("/ testing /" + COMPLETE_DOCUMENT + ".xml"); – MaVVamaldo

0

Khi bạn gọi Class.getResourceAsStream() với tên tài nguyên không có dấu gạch chéo, nó giả sử bạn đang yêu cầu tài nguyên liên quan đến gói hiện tại (tức là gói của lớp người gọi). Để biến nó thành đường dẫn tài nguyên tuyệt đối, bạn cần phải thêm dấu gạch chéo vào tên tài nguyên, ví dụ:trong trường hợp của bạn "/testing/"+ COMPLETE_DOCUMENT + ".xml"

Các vấn đề liên quan