2010-09-02 25 views
8

Tôi muốn sử dụng anti-samy từ OWASP. Họ có một đối tượng Chính sách, được khởi tạo thông qua một phương thức nhà máy.Mùa xuân: Nạp tài nguyên dưới dạng InputStream vào một phương thức nhà máy

public static Policy getInstance(InputStream inputStream); 

InputStream cần được chuyển đến phương thức nhà máy đại diện cho tệp cấu hình cho đối tượng chính sách.

Có thể sử dụng tạo bean chính sách trong cấu hình ngữ cảnh xml mùa xuân không? Tôi biết, có một đối tượng Tài nguyên, có thể tải các tệp từ classpath. Nhưng điều tôi cần là tạo một InputStream từ đối tượng Tài nguyên đó. Tôi có thể làm điều này trực tiếp trong bối cảnh xml-spring không? Hay tôi cần viết mã java để lấy InputStream?

Trả lời

15

Sử dụng phương pháp tiếp cận phương pháp nhà máy cùng với hàm tạo-arg (sẽ được ánh xạ tới đối số phương thức nhà máy) và tự động chuyển đổi thành InputStream từ ký hiệu tài nguyên.

<bean id="policy" class="org.owasp.validator.html.Policy" 
    factory-method="getInstance"> 

    <!-- type needed because there is also a getInstance(String) method --> 
    <constructor-arg 
     value="classpath:path/to/policyFile.xml" 
     type="java.io.InputStream" /> 

</bean> 

Xem các phần sau đây của Spring Reference:

+3

Xin chào, tôi đã không nhận ra Spring có thể ép buộc vào 'InputStream', gọn gàng. Tuy nhiên, lưu ý rằng Spring sẽ không tự đóng 'InputStream', nó giả định rằng bean sẽ làm điều đó. Nếu lớp 'Policy' không đóng luồng đó thì bạn sẽ bị rò rỉ. – skaffman

+0

Quan sát tốt. Chính sách không đóng InputStream: http://code.google.com/p/owaspantisamy/source/browse/trunk/Java/current/antisamy-project/antisamy/src/main/java/org/owasp/validator/html /Policy.java#210. Điều này nên được báo cáo như là một lỗi, tôi đoán –

+0

Hm, sau đó tôi sẽ mở và đóng InputStream trong java-code. Tuy nhiên, cấu trúc trông gọn gàng, nhưng khi tôi dùng thử, tôi nhận được một FileNotFoundException, cho tôi biết nó không thể tìm thấy ' classpath: tempo-antisamy.xml '. Bằng cách nào đó tiền tố classpath không được tách ra khỏi tên tệp – nebenmir

4

@ seanizer của giải pháp sẽ là một tốt nếu Policy đóng InputStream sau khi nó đã được đọc xong từ nó, nhưng dường như nó không. Điều này sẽ dẫn đến rò rỉ, mức độ nghiêm trọng trong đó phụ thuộc vào mức độ thường xuyên nó được gọi, và bản chất của tài nguyên.

Để an toàn, bạn nên xem xét writing a custom FactoryBean implementation thay vào đó, xử lý việc mở và đóng của InputStream một cách an toàn. Các FactoryBean sẽ được tiêm với một đối tượng Resource.

+0

Nó không phải là một vấn đề cho một hạt đơn, nhưng nó có thể một mớ hỗn độn thực sự trong một chiếc nguyên mẫu đậu, tôi đồng ý. –

+0

@seanizer: Chỉ cần như vậy. Ngoài ra, trên các cửa sổ sẽ giữ khóa mở tệp miễn là ứng dụng đang chạy, có thể là PITA thực. – skaffman

+0

giả sử đó là một tệp và không phải là tài nguyên jar, có –

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