Announcement Announcement Module
No announcement yet.
Programmatic property placeholder resolving Page Title Module
Move Remove Collapse
Conversation Detail Module
  • Filter
  • Time
  • Show
Clear All
new posts

  • Programmatic property placeholder resolving

    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

    	<!-- Handles HTTP GET requests for /resources/version/**  -->
    	<resources mapping="/${app.resources.path}/**" location="/static/" cache-period="31556926"/> 
    	<!-- Web properties -->
    	<context:property-placeholder location="
    2) Inside, there are 2 properties, among others:

    # Properties provided (filtered) by Maven itself
    app.version: 0.1-SNAPSHOT
    # Static resources mapping
    app.resources.path: resources/${app.version}
    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.

    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:

    // returns null
    PropertyResolver resolver = getRequestContext().getWebApplicationContext().getBean(PropertyResolver.class);
    // returns null, its the same web context instance (as expected)
    PropertyResolver resolver2 = WebApplicationContextUtils.getRequiredWebApplicationContext(pageContext.getServletContext()).getBean(PropertyResolver.class);
    // throws NPE, resolver3 is null as StringValueResolver is not bound
    StringValueResolver resolver3 = getRequestContext().getWebApplicationContext().getBean(StringValueResolver.class);
    // null, since context: property-placeholder does not register itself as PropertySource
    Environment env = getRequestContext().getWebApplicationContext().getEnvironment();
    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.
    Any help or ideas to check are highly appreciated.