I currently work on a web application based on Spring 3.1.0.M1, annotations based, and I have a problem with resolving property placeholders in one specific place of my application.
Here is the story.
1) In my web application context (loaded by DispatcherServlet), i have
2) Inside app.properties, there are 2 properties, among others:Code:<!-- 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 "/>
3) I have a JSP custom tag <app:resource value="/images/test.png"> in my JSP 2.1 templates. This tag is responsible for full resource path construction depending on environment settings, app version, spring theme selection etc. Custom tag class extends <spring:url> implementation class, so it may be considered a usual url tag but with some additional knowledge about proper path.Code:# Properties provided (filtered) by Maven itself app.version: 0.1-SNAPSHOT ... # Static resources mapping app.resources.path: resources/${app.version}
My problem is that I cannot get ${app.resources.path} correctly resolved in my JSP custom tag implementation. JSP custom tags are managed by servlet container, not Spring, and therefore dont participate in DI. So I cannot just use usual @Value("${app.resources.path}") and get it resolved by Spring automatically.
All I have there is the web application context instance, so I have to resolve my property programmatically.
So far I tried:
So now I'm kinda stuck with that. I know that the ability to resolve my placeholder is somewhere in the context, I just don't know the correct way to do it.Code:// 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");
Any help or ideas to check are highly appreciated.


Reply With Quote