2010-09-02 8 views
8

Ich möchte Anti-Samy von OWASP verwenden. Sie haben ein Richtlinienobjekt, das über eine Factory-Methode instanziiert wird.Spring: Injection Ressource als InputStream in eine Factory-Methode

Der InputStream, der an die Factory-Methode übergeben werden muss, stellt die Konfigurationsdatei für das Richtlinienobjekt dar.

Ist es möglich, eine Richtlinien-Bean in einer Spring XML Context Config zu erstellen? Ich weiß, dass es ein Ressource-Objekt gibt, das Dateien aus dem Klassenpfad laden kann. Aber was ich brauche ist, einen InputStream aus diesem Resource-Objekt zu machen. Kann ich das direkt im xml-spring-Kontext machen? Oder muss ich Java-Code schreiben, um den InputStream zu bekommen?

Antwort

15

Verwenden Sie den Factory-Methode-Ansatz zusammen mit einem Konstruktor-Argument (das einem Factory-Methodenargument zugeordnet wird) und werden automatisch aus einer Ressourcennotation in einen InputStream konvertiert.

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

Siehe folgende Teile der Spring Reference:

+3

Hey, ich wusste nicht, dass Spring zu 'InputStream' zwingen könnte, das ist ordentlich. Beachten Sie jedoch, dass Spring den 'InputStream' selbst nicht schließt, sondern davon ausgeht, dass die Bean dies tut. Wenn die Klasse "Policy" diesen Stream nicht schließt, kommt es zu einem Leck. – skaffman

+0

Gut beobachtet. Die Richtlinie schließt den InputStream nicht: http://code.google.com/p/owaspantisamy/source/browse/trunk/Java/current/antisamy-project/antisamy/src/main/java/org/owasp/validator/html /Policy.java#210. Dies sollte als Fehler gemeldet werden, ich denke –

+0

Hm, dann werde ich den InputStream in Java-Code öffnen und schließen. Allerdings ist das Konstrukt sieht ordentlich aus, aber wenn ich es ausprobiere, bekomme ich eine FileNotFoundException, die mir sagt, dass es nicht finden kann ' Klassenpfad: tempo-antisamy.xml '. Irgendwie ist das Klassenpfad-Präfix nicht vom Dateinamen getrennt – nebenmir

4

@ Seanizer-Lösung wäre eine gute, wenn Policy die InputStream nach dem Lesen von ihm geschlossen wurde, aber anscheinend tut es nicht. Dies führt zu einem Leck, dessen Schwere davon abhängt, wie oft es aufgerufen wird, und der Art der Ressource.

Um sicher zu sein, sollten Sie stattdessen writing a custom FactoryBean implementation betrachten, die das Öffnen und Schließen des InputStream sicher handhabt. Die FactoryBean würde mit einem Resource Objekt injiziert werden.

+0

Es sollte kein Problem für eine Singleton Bean sein, aber es könnte sein ein echtes Durcheinander in einer Prototyp-Bohne, stimme ich zu. –

+0

@seanizer: Nur so. Auch unter Windows wird so lange eine geöffnete Datei gesperrt, wie die App läuft, was eine echte PITA sein kann. – skaffman

+0

vorausgesetzt, es ist eine Datei und keine Jar-Ressource, ja –

Verwandte Themen