2010-09-02 1 views
8

Я хочу использовать анти-samy из OWASP. У них есть объект Policy, который создается с помощью фабричного метода.Spring: Injecting Resource as InputStream в заводской метод

InputStream, который необходимо передать фабричному методу, представляет собой конфигурационный файл для объекта политики.

Можно ли создать политический компонент в конфигурации контекста весны xml? Я знаю, что есть объект Resource, который может загружать файлы из classpath. Но мне нужно сделать InputStream из этого ресурса. Могу ли я сделать это непосредственно в контексте xml-spring? Или мне нужно написать Java-код, чтобы получить InputStream?

ответ

15

Используйте метод заводского метода вместе с конструктором-arg (который будет сопоставлен с аргументом фабричного метода) и автоматически преобразуется в InputStream из нотации ресурсов.

<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> 

Смотрите следующие части Spring Reference:

+3

Эй, я не понимал, что Весна может принуждать к «InputStream», это аккуратно. Обратите внимание, однако, что Spring не закрывает 'InputStream' сам, он предполагает, что bean будет делать это. Если класс 'Policy' не закрывает этот поток, вы получите утечку. – skaffman

+0

Хорошо наблюдается. Политика не закрывает 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. Это должно быть сообщено как ошибка, я думаю, –

+0

Hm, тогда я открою и закрою InputStream в java-коде. Однако конструктор выглядит аккуратно, но когда я его пробовал, я получаю исключение FileNotFoundException, которое говорит мне, что он не может найти ' Путь к классам: темп-antisamy.xml. Как-то префикс classpath не отделен от имени файла – nebenmir

4

@ Решение seanizer было бы хорошим, если Policy закрыл InputStream после того, как он был готов к чтению, но, видимо, этого не происходит. Это приведет к утечке, серьезность которой зависит от того, как часто она называется, и характера ресурса.

Чтобы быть в безопасности, вы должны принять во внимание writing a custom FactoryBean implementation, который безопасно обрабатывает открытие и закрытие InputStream. В FactoryBean вводится объект Resource.

+0

Это не должно быть проблемой для одноэлементного компонента, но это может быть я согласен, настоящий беспорядок в прототипе фасоли. –

+0

@ Интерфейс: Только так. Кроме того, в окнах, которые будут хранить блокировку открытого файла до тех пор, пока приложение будет запущено, что может быть настоящим PITA. – skaffman

+0

Предполагая, что это файл, а не ресурс банки, да –

Смежные вопросы