2011-09-20 16 views
27

W mojej aplikacji Spring 3.0 mam pewne zasoby w /WEB-INF/dir. W czasie wykonywania potrzebuję niektórych z nich jako InputStream (lub innego typu). Jak mogę je odzyskać? Czy jest możliwe wstrzyknięcie ich jako normalnego Resource?Wiosna 3.0 pliki do iniekcji jako zasoby

Odpowiedz

54

Oto najprostszy sposób to zrobić za pośrednictwem adnotacji:

import org.springframework.core.io.Resource; 

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

To całkiem fajne! – Kong

+1

Każdy pomysł, w jaki sposób można załadować katalog? E.g, katalog "dir", który zawiera 25 plików –

+0

To całkiem fajne, ale może nie działać w pliku jar. –

2

Powinieneś być w stanie używać:

Resource resource = appContext.getResource("classpath:<your resource name>"); 
InputStream is = resource.getInputStream(); 

gdzie appContext to Wiosna ApplicationContext (konkretnie, WebApplicationContext, ponieważ masz webapp)

+0

Opcja ' Interfejs zasobów nie deklaruje metody 'getInputStream()', należy wywołać 'new FileInputStream (resource.getFile())'. –

+0

To jest nieprawidłowe. 'Zasób' dziedziczy go z interfejsu' org.springframework.core.io.InputStreamSource' – Saket

+0

Moje złe, przepraszam, nie widziałem "narzędzi". –

-1

Jeśli nie chcą wprowadzić zależność na wiosnę , postępuj zgodnie z podejściem opisanym tutaj: Populate Spring Bean's File field via Annotation

+0

Nie widzę, jak jedna z odpowiedzi na to pytanie skutkuje zmniejszoną zależnością od Spring ... –

+0

Zgadzam się, że użycie @Value nie jest zależnością zerowej wiosny. –

+1

Ale adnotacje to najlepszy sposób na uzyskanie wstrzyknięcia sprężyny bez naruszania zasady "nie-powtarzaj-siebie". Podejście XML, które polecasz, zmusza Cię do powtórzenia się. Prędzej czy później ktoś zmieni nazwę właściwości w pliku Java i zapomni zaktualizować plik definicji beli sprężystej. –

5

s Wszystkie są z definicji . Oznacza to, że są one w stanie rozdzielić wszystkie ciągi zasobów znalezione w ich konfiguracji. Mając to na uwadze, możesz zadeklarować swój cel za pomocą settera, który akceptuje org.springframework.core.io.Resource. Następnie podczas konfigurowania komponentu bean celu należy użyć ścieżki zasobu w wartości właściwości. Spring spróbuje przekształcić wartość String w konfiguracji na Resource.

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

Oto pełny przykład, aby pobrać zasób classpath. Używam go chwycić pliki SQL, które mają bardzo złożonych zapytań, które nie chcą, aby zapisać w klasach Javy:

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(); 
} 
Powiązane problemy