2012-04-02 5 views
0

Kann jemand einen Feder-Anwendungskontext zu einem bestimmten Resource Resolver verwenden. Ich habe eine s3-Ressource geschrieben, um Inhalt aus einem Sicherheitskontext von Amazon S3 zu ziehen, und einen Ressourcen-Resolver, um diese "Ressourcen" von s3: // ... Typ-URLs zu erstellen, und der lokale Anwendungskontext verwendet beim Laden die richtigen Sicherheitsberechtigungsnachweise aus dem konfigurierten amazons3client. Ich habe einen s3 ResourceLoader geschrieben, der den AmazonS3-Client für eine neu erstellte s3-Ressource vorkonfiguriert.Springframe-Anwendung Kontext Ressource Resolver

Es wäre nett, diese Ressourcen in der Kontextkonfiguration als einfach "s3: // ..." angeben zu können und sich auf diesen Resource Resolver zu verlassen, um den richtigen Ressourcentyp zu erstellen, jedoch muss dies überschrieben werden Die getResource-Methode von Spring ApplicationContext wurde von DefaultResourceLoader geerbt, um meine eigene resourceResolver-Implementierung zu verwenden.

Ein weiterer Tack ist eine variable Resolver für Ressourcen zu konfigurieren, die passenden „s3: // ...“ Schema Ressourcentypen mit dieser Ressource Resolver zu lösen.

Ich hoffe, dass ihr ein Frühlingsguru heraus ist, der eine bessere Weise kennt, die Infrastruktur des Frühlingsanwendungszusammenhangs (ClasspathXMLAC für Argumente wake) zu manipulieren, um meine S3 Sicherheitsbedürfnisse sehr einfach zu behandeln zu machen.

Andere Vorschläge sind willkommen.

Antwort

1

Verwenden Sie eine Implementierung von Spring GenericApplicationContext, die Sie mit einem #setResourceLoader Verfahren zur Verfügung stellt.

Sie haben ClassPathXmlApplicationContext erwähnt, was kein GenericApplicationContext ist, was bedeutet, dass Sie gezwungen sind, die hässlichere Überschreibungsroute zu verwenden.

GenericXmlApplicationContext ist eine allgemein bevorzugte Alternative zu CPXAC, und wie der Name schon sagt, ist ein GenericApplicationContext.

So sollten Sie in der Lage sein, wie folgt vorgehen:

GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(); 
ctx.setResourceLoader(new S3ResourceLoader()); 
ctx.load("s3:///some.bucket.name/path/to/my/spring.xml"); 
ctx.refresh(); 
... 

Offensichtlich ist die S3ResourceLoader müssen mit den Tasten parametriert werden, usw. Beachten Sie, dass die S3ResourceLoader sollte wohl DefaultResourceLoader erstrecken, um alle zu holen die andere dort verfügbare Funktionen, z Verarbeitung "Klassenpfad:" und andere Ressourcenpräfixe.

Reihenfolge des Aufrufs in den obigen Beispiel Fragen, das hieß die Ressource-Lade muss zur Verfügung gestellt werden, bevor #LOAD mit einem s3 aufgerufen wird: Ressourcen Präfix aus offensichtlichen Gründen.

+0

Ich hatte gehofft, dass diese Funktionalität wegen Bohnen in dem Kontext aufgenommen würde. Was ich gerade ausarbeite, ist das Einrichten der AmazonS3Client-Bean, gefolgt von einer abhängigen ApplicationContextAware S3Loader-Bean, die DefaultResourceLoader erweitert und dann den setApplicationContext ausführt, wenn eine Anwendungsinstanz des GenericApplication-Kontexts den resourceLoader auf den s3Loader setzt Resource Loader muss s3 und MongoDBs GridFS unterstützen, daher brauche ich einen neuen Namen: P. – gbegley

+0

Sie können einen CompositeResourceLoader erstellen, der an N ResourceLoader-Instanzen delegiert.Sie ​​können dann diskrete S3-, Mongo- und GridFS-basierte ResourceLoader haben, um sie zu aggregieren alles unter einem einzigen CompositeResourceLoader und übergibt diese an die # setResourceLoader-Methode von GenericApplicationContext. –

Verwandte Themen