2010-09-02 8 views
8

Quiero utilizar anti-samy de OWASP. Obtuvieron un objeto de política, que se crea una instancia a través de un método de fábrica.Spring: Recurso de inyección como InputStream en un método de fábrica

public static Policy getInstance(InputStream inputStream); 

El InputStream que necesita ser pasado a la fábrica método representa el archivo de configuración para el objeto de directiva.

¿Es posible usar create a policy bean en una configuración de contexto spring xml? Sé que hay un objeto Resource que puede cargar archivos desde classpath. Pero lo que necesito es hacer un InputStream fuera de ese objeto Resource. ¿Puedo hacer esto directamente en el contexto xml-spring? ¿O necesito escribir código Java para obtener el InputStream?

Respuesta

15

Utilice el enfoque de método de fábrica junto con un constructor-arg (que se correlacionará con un argumento de método de fábrica) y se convertirá automáticamente a un InputStream a partir de una notación de recursos.

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

Consulte las siguientes partes de la Spring Reference:

+3

Oye, no me di cuenta de que Spring podría forzar a 'InputStream', eso está bien. Sin embargo, tenga en cuenta que Spring no cerrará el 'InputStream' en sí, sino que asumirá que el bean lo hará. Si la clase 'Policy' no cierra esa secuencia, terminará con una fuga. – skaffman

+0

Bien observado. La política no cierra el 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. Esto se debe informar como un error, supongo –

+0

Hm, luego voy a abrir y cerrar el InputStream en código java. Sin embargo, la construcción se ve bien, pero cuando la pruebo, obtengo una excepción FileNotFoundException, que me dice que no puede encontrarla ' classpath: tempo-antisamy.xml '. De alguna manera, el prefijo classpath no está separado del nombre de archivo – nebenmir

4

La solución de @serisaizer sería buena si Policy cerró el InputStream después de haber terminado de leerlo, pero aparentemente no es así. Esto dará lugar a una fuga, cuya severidad depende de la frecuencia con que se llame y la naturaleza del recurso.

En su lugar, debe considerar writing a custom FactoryBean implementation en su lugar, que maneja la apertura y el cierre de la InputStream de forma segura. El FactoryBean se inyectaría con un objeto Resource.

+0

No debería ser un problema para un bean singleton, pero podría ser un verdadero desastre en un prototipo de frijol, estoy de acuerdo. –

+0

@seanizer: Así es. Además, en Windows mantendrá un bloqueo de archivo abierto mientras se ejecuta la aplicación, que puede ser un PITA real. – skaffman

+0

asumiendo que es un archivo y no un recurso jar, sí –

Cuestiones relacionadas