2011-09-20 21 views
27

Spring 3.0 uygulamasında, /WEB-INF/dir içinde bazı kaynaklara sahibim. Çalışma zamanında bunlardan bazılarına InputStream (veya başka bir tür) olarak ihtiyacım var. Onları nasıl alabilirim? Bunları normal Resource olarak enjekte etmek mümkün mü?Spring 3.0, dosyaları kaynak olarak sıkıştır

cevap

54

açıklama yoluyla bunu yapmak için bir kolay yolu: Ben Java sınıfları içinde saklamak istemiyorsanız gerçekten karmaşık sorgular sahip SQL dosyaları kapmak için kullanabilirsiniz

import org.springframework.core.io.Resource; 

@Value("classpath:<path to file>") 
private Resource cert; 
+0

Bu oldukça havalı! – Kong

+1

Bir dizin nasıl yüklenebilir? E.g, 25 dosya –

+0

içeren bir dizin "dir" Bu oldukça güzel ama kavanoz dosyası içinde çalışmayabilir. –

2

Kullanılacak gerekir:

appContext sizin Bahar ApplicationContext olduğunu
Resource resource = appContext.getResource("classpath:<your resource name>"); 
InputStream is = resource.getInputStream(); 

+0

' Kaynak arabirimi 'getInputStream()' yöntemini bildirmez, yeni FileInputStream (resource.getFile()) 'işlevini çağırmanız gerekir. –

+0

Bu yanlış. 'Kaynak', 'org.springframework.core.io.InputStreamSource' – Saket

+0

arayüzünden miras alır. Kötü, üzgünüm,' implements 'görmedim. –

-1

Eğer Spring bağımlılığını tanıtmak istemiyorsanız (özellikle, bir WebApplicationContext, bir webapp var çünkü) yaklaşım burada ayrıntılı izleyin: Populate Spring Bean's File field via Annotation

+0

Bu soruya verilen yanıtlardan herhangi birinin Bahar'a bağımlılığın azalmasıyla sonuçlanamadığını göremiyorum ... –

+0

@Value kullanımı sıfır yay bağımlılığı olmadığını kabul ediyorum. –

+1

Ancak ek açıklamalar, tekrar etmeyiniz ilkesini ihlal etmeden yay enjeksiyonunu elde etmenin en iyi yoludur. Önereceğiniz XML yaklaşımı, kendinizi tekrar etmenize zorlar. Er ya da geç birileri java dosyasındaki özellik adını değiştirecek ve baharlık fasülye tanımlama dosyasını güncellemeyi unutmayacak. –

5

Tüm ApplicationContext s, tanımı gereği, ResourceLoader ler vardır. Bu, yapılandırmalarında bulunan herhangi bir kaynak dizgisini çözebilecekleri anlamına gelir. Bunu göz önünde bulundurarak, hedef çekirdeğinizi bir org.springframework.core.io.Resource kabul eden bir düzenleyici ile bildirebilirsiniz. Daha sonra, hedef çekirdeği yapılandırırken, yalnızca özellik değerinde bir kaynak yolu kullanın. Spring, yapılandırmanızda bulunan String değerini Resource'a dönüştürmeyi deneyecektir.

public class Target { 
    private Resource resource; 
    public void setResource(final Resource resource) { 
    this.resource = resource; 
    } 
} 

//configuration 
<beans> 
    <bean id="target" class="Target"> 
    <property name="resource" value="classpath:path/to/file"/> 
    </bean> 
</beans> 
1

Burada bir sınıf yolu kaynağını almak için tam bir örnek var.

İşte
public String getSqlFileContents(String fileName) { 
    StringBuffer sb = new StringBuffer(); 
    try { 
     Resource resource = new ClassPathResource(fileName); 
     DataInputStream in = new DataInputStream(resource.getInputStream()); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
     String strLine; 
     while ((strLine = br.readLine()) != null) { 
      sb.append(" " + strLine); 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return sb.toString(); 
} 
İlgili konular