Java Spring:将资源作为InputStream注入工厂方法

Java Spring:将资源作为InputStream注入工厂方法,java,spring,Java,Spring,我想使用来自OWASP的反samy。 他们得到了一个通过工厂方法实例化的策略对象 public static Policy getInstance(InputStream inputStream); 需要传递给工厂方法的InputStream表示策略对象的配置文件 是否可以在SpringXML上下文配置中使用创建策略bean? 我知道,有一个资源对象,可以从类路径加载文件。但我需要的是从资源对象中生成一个InputStream。我可以直接在XMLSpring上下文中这样做吗?或者我需要编写ja

我想使用来自OWASP的反samy。 他们得到了一个通过工厂方法实例化的策略对象

public static Policy getInstance(InputStream inputStream);
需要传递给工厂方法的InputStream表示策略对象的配置文件

是否可以在SpringXML上下文配置中使用创建策略bean?
我知道,有一个资源对象,可以从类路径加载文件。但我需要的是从资源对象中生成一个InputStream。我可以直接在XMLSpring上下文中这样做吗?或者我需要编写java代码才能获得InputStream吗?

将工厂方法方法与构造函数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>

请参阅本手册的以下部分:

  • (与此相关)
  • (最后一节是关于在静态
    工厂方法的上下文中使用的
    构造函数arg

@seanizer的解决方案是一个很好的解决方案,如果
Policy
在完成对
InputStream的读取后关闭
InputStream
,但显然它没有。这将导致泄漏,泄漏的严重程度取决于调用的频率和资源的性质


为安全起见,您应该考虑,它安全地处理<代码>输入流< /代码>的打开和关闭。

FactoryBean
将被注入
资源
对象。

嘿,我没有意识到Spring可以强制
输入流
,这很好。但是请注意,Spring不会关闭
InputStream
本身,它假定bean会这样做。如果
Policy
类没有关闭该流,那么您将以泄漏告终。观察得很好。策略未关闭InputStream:。我想这应该被报告为一个bug,然后我将用java代码打开和关闭InputStream。然而,这个构造看起来很整洁,但是当我尝试它时,我得到一个FileNotFoundException,它告诉我它找不到“classpath:tempo antisamy.xml”。不知何故,类路径前缀没有与filename@seanizer:我不认为这是
策略中的错误。在打开它们的同一段代码中关闭流是一种很好的做法,这将打破这种做法。@nebenmir:很明显。它试图用字符串参数实例化该方法:我将试着看看我们能做些什么……对于单例bean来说,这应该不是一个问题,但在原型bean中它可能是一个真正的烂摊子,我同意。@seanizer:就这样。另外,在windows上,只要应用程序在运行,就会保持一个打开的文件锁,这可能是一个真正的PITA