2011-01-02 9 views
15

Quiero inyectar la URL de un recurso classpath de una manera que no cree una dependencia en Spring en el Bean. Es decir, el bean no debería usar las interfaces/clases de Spring. ¿Cómo puedo hacer eso?Primavera: Inyectar URL para el recurso classpath

+0

¿Qué quiere decir con "URL", exactamente? Este es un concepto bastante artificial con recursos classpath: ¿qué harías con esa URL? – skaffman

+0

abrir una secuencia y leer de ella – IttayD

+0

Si se trata de un recurso de ruta de clase, ¿por qué no solo inyectar la ruta en sí? Hay poco valor en la abstracción de recursos de Spring si no vas a usarlo. – skaffman

Respuesta

15

primavera es capaz de convertir los valores en classpath:...java.net.URL implícitamente:

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

.

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

Causado por: org.springframework.core.convert.ConversionFailedException: no se puede convertir el valor "classpath: etc/warmup.xml" de tipo 'java.lang.String' para escribir 'java.net.URL'; la excepción anidada es java.net.MalformedURLException: protocolo desconocido: classpath – IttayD

+0

@IttayD: Funciona bien para mí en Spring 3.0.2. Tenga en cuenta que la ruta debe apuntar al recurso existente. – axtavt

+0

Tengo la primavera 3.0.4. Miré el código fuente de la primavera y no puedo ver dónde manejaba "classpath:" urls diferentes. Por lo que veo, trivialmente intenta convertir a URL. No pude encontrar ninguna implementación URLStreamHandler para "classpath" – IttayD

1

Casi no hay nada que no sea de resorte que sea equivalente a Spring's resource concept.

Por ejemplo, puede usar Guava's InputSupplier como alternativa, pero le faltan características de resorte estándar potentes si lo hace.

2

cree su propia implementación de un recurso de resorte extendiendo org.springframework.core.io.ClassPathResource como MyClasspathResource extiende ClassPathResource e inyecte este tipo en su bean. De esta manera, no tienes ninguna dependencia con la primavera y luego puedes volver a implementar tu recurso con otra cosa.

<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

A raíz de la respuesta de axtavt, si se permitirán primavera anotaciones en el grano, puede hacerlo de esta manera:

@Value("classpath:myClasspathLocation") private URL url; 
Cuestiones relacionadas