2010-09-02 19 views
8

Desidero utilizzare anti-samy da OWASP. Hanno ottenuto un oggetto Policy, che viene istanziato tramite un metodo factory.Spring: Injecting Resource come InputStream in un metodo factory

public static Policy getInstance(InputStream inputStream); 

InputStream che deve essere passato al metodo factory rappresenta il file di configurazione per l'oggetto della politica.

È possibile utilizzare creare un bean di criteri in una configurazione di contesto xml di primavera? So che esiste un oggetto risorsa, che può caricare file da classpath. Ma ciò di cui ho bisogno è di rendere un InputStream fuori da quell'oggetto risorsa. Posso farlo direttamente nel contesto xml-spring? O devo scrivere codice java per ottenere InputStream?

risposta

15

Utilizzare l'approccio del metodo di fabbrica insieme a un argomento di costruzione (che verrà mappato su un argomento del metodo factory) e convertito automaticamente in un InputStream da una notazione di risorsa.

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

Vedi le seguenti parti del Spring Reference:

+3

Ehi, non mi ero reso conto che Spring avrebbe potuto forzare su 'InputStream', è pulito. Nota, comunque, che Spring non chiuderà lo stesso 'InputStream', presuppone che il bean lo farà. Se la classe 'Policy' non chiude quel flusso, allora finirai con una perdita. – skaffman

+0

Ben osservato. La politica non chiude 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. Questo dovrebbe essere segnalato come un bug, immagino che sia –

+0

Hm, quindi aprirò e chiuderò InputStream in java-code. Tuttavia, il costrutto sembra pulito, ma quando provo, ottengo un FileNotFoundException, che mi dice che non riesce a trovare " classpath: tempo-antisamy.xml'. In qualche modo il prefisso del percorso di classe non è separato dal nome file – nebenmir

4

La soluzione di @ seanizer sarebbe buona se Policy chiudesse il InputStream dopo averlo letto da esso, ma apparentemente non lo è. Ciò comporterà una perdita, la cui gravità dipende dalla frequenza con cui viene chiamata e dalla natura della risorsa.

Per sicurezza, si consiglia di considerare writing a custom FactoryBean implementation invece, che gestisce l'apertura e la chiusura di InputStream in modo sicuro. FactoryBean verrà iniettato con un oggetto Resource.

+0

Non dovrebbe essere un problema per un bean singleton, ma potrebbe essere un vero casino in un prototipo di fagioli, sono d'accordo. –

+0

@seanizer: proprio così. Inoltre, su Windows che manterrà un blocco di file aperto fino a quando l'app è in esecuzione, che può essere un vero PITA. – skaffman

+0

assumendo che si tratti di un file e non di una risorsa jar, sì –

Problemi correlati