2011-01-02 10 views
15

Chcę wstawić adres URL zasobu klasy clas w sposób, który nie powoduje zależności od Spring in the Bean. Oznacza to, że komponent bean nie powinien używać interfejsów/klas Spring. Jak mogę to zrobić?Spring: Inject URL dla zasobu classpath

+0

Co masz na myśli przez „URL”, dokładnie? Jest to dość sztuczna koncepcja z zasobami klasy clas - co byś zrobił z tym URL? – skaffman

+0

otwórz strumień i odczytaj z niego – IttayD

+0

Jeśli jest to zasób ścieżki klasy, dlaczego nie wystarczy wstrzyknąć samej ścieżki? W przypadku abstrakcji zasobów wiosennych jest mało wartości, jeśli nie zamierzasz jej użyć. – skaffman

Odpowiedz

15

Wiosna jest w stanie przerobić classpath:... wartości do java.net.URL domyśle:

public class Foo { 
    private URL url; 
    ... 
} 

.

<bean class = "Foo"> 
    <property name = "url" value = "classpath:..." /> 
</bean> 
+2

Powodowane przez: org.springframework.core.convert.ConversionFailedException: Nie można skonwertować wartości "classpath: etc/warmup.xml" z typu 'java.lang.String' na type 'java.net.URL'; Zagnieżdżony wyjątek to java.net.MalformedURLException: unknown protocol: classpath – IttayD

+0

@IttayD: Działa dobrze dla mnie na wiosnę 3.0.2. Zauważ, że ścieżka musi wskazywać na istniejący zasób. – axtavt

+0

Mam wiosnę 3.0.4. Przyjrzałem się źródłowi kodu źródłowego i nie widziałem, gdzie obsługiwane są adresy URL "classpath:". Z tego, co widzę, trywialnie próbuje przekonwertować na URL. Nie mogłem znaleźć żadnej implementacji URLStreamHandler dla "classpath" – IttayD

2

Utwórz własną implementację zasobu źródłowego, rozszerzając gałąź org.springframework.core.io.ClassPathResource, np. MyClasspathResource, rozszerza ClassPathResource i dodaje ten typ do komponentu bean. W ten sposób nie masz żadnej zależności od wiosny i możesz później ponownie wprowadzić swój zasób w coś innego.

<bean class="myBean"> 
<property name="classPathType"> 
    <bean class="org.test.bla.MyClasspathResource"> 
    <constructor-arg index="0" value="classpath:/org/test/bla/MyUrl" /> 
    </bean> 
</property> 
</bean> 
4

W nawiązaniu do odpowiedzi axtavt, o ile pozwolisz sobie Wiosna adnotacji w fasoli, można zrobić to tak:

@Value("classpath:myClasspathLocation") private URL url; 
Powiązane problemy