Actualmente trabajo en una aplicación web basada en Spring 3.1.0.M1, basada en anotaciones, y tengo un problema para resolver marcadores de posición de propiedad en un lugar específico de mi aplicación.Cómo resolver mediante programación el marcador de posición de propiedad en Spring
Aquí está la historia.
1) En mi contexto de aplicaciones web (cargado por DispatcherServlet), tengo
mvc-config.xml:
<!-- Handles HTTP GET requests for /resources/version/** -->
<resources mapping="/${app.resources.path}/**" location="/static/" cache-period="31556926"/>
...
<!-- Web properties -->
<context:property-placeholder location="
classpath:app.properties
"/>
2) Dentro de app.properties, hay 2 propiedades, entre otros :
app.properties:
# Properties provided (filtered) by Maven itself
app.version: 0.1-SNAPSHOT
...
# Static resources mapping
app.resources.path: resources/${app.version}
3) tengo una etiqueta personalizada JSP en mi JS P 2.1 plantillas. Esta etiqueta es responsable de la construcción completa de rutas de recursos dependiendo de la configuración del entorno, la versión de la aplicación, la selección del tema de primavera, etc. La clase de etiqueta personalizada extiende la clase de implementación de spring: url, por lo que puede considerarse una etiqueta url habitual pero con algunos conocimientos adicionales.
Mi problema es que no puedo obtener $ {app.resources.path} resuelto correctamente en la implementación de mi etiqueta personalizada JSP. Las etiquetas personalizadas de JSP son administradas por el contenedor de servlets, no por Spring, y por lo tanto no participan en DI. Así que no puedo usar el @Value habitual ("$ {app.resources.path}") y Spring lo resuelve automáticamente.
Todo lo que tengo allí es la instancia de contexto de la aplicación web, así que tengo que resolver mi propiedad mediante programación.
Hasta ahora he intentado:
ResourceTag.java:
// returns null
PropertyResolver resolver = getRequestContext().getWebApplicationContext().getBean(PropertyResolver.class);
resolver.getProperty("app.resources.path");
// returns null, its the same web context instance (as expected)
PropertyResolver resolver2 = WebApplicationContextUtils.getRequiredWebApplicationContext(pageContext.getServletContext()).getBean(PropertyResolver.class);
resolver2.getProperty("app.resources.path");
// throws NPE, resolver3 is null as StringValueResolver is not bound
StringValueResolver resolver3 = getRequestContext().getWebApplicationContext().getBean(StringValueResolver.class);
resolver3.resolveStringValue("app.resources.path");
// null, since context: property-placeholder does not register itself as PropertySource
Environment env = getRequestContext().getWebApplicationContext().getEnvironment();
env.getProperty("app.resources.path");
Así que ahora estoy un poco atascado con eso. Sé que la capacidad de resolver mi marcador de posición está en algún lugar del contexto, simplemente no sé la forma correcta de hacerlo.
Cualquier ayuda o ideas para verificar son muy apreciadas.
Gracias, Ritesh. Creo que puedo usar esta solución, en caso de que no se encuentre nada más elegante. –
Marcó esta respuesta como Aceptada, pero de todos modos es interesante encontrar una solución puramente programática. –
@Max Alexejev También puede extender PropertyPlaceholderConfigurer y capturar propiedades resueltos que se pasan en el segundo argumento al método processProperties. Pero luego tendrá que usar la configuración de bean en lugar de context: property-placeholder. – Ritesh