Как программно разрешить заполнитель свойств в Spring

В настоящее время я работаю над веб-приложением на основе Spring 3.1.0.M1, основанном на аннотациях, и у меня проблема с разрешением заполнителей свойств в одном конкретном месте моего приложения.

Вот история.

1) В контексте моего веб-приложения (загруженного DispatcherServlet) у меня есть

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) Внутри app.properties есть 2 свойства, среди прочих:

app.properties:

# Properties provided (filtered) by Maven itself
app.version: 0.1-SNAPSHOT
...

# Static resources mapping
app.resources.path: resources/${app.version}

3) В моих шаблонах JSP 2.1 есть специальный тег JSP. Этот тег отвечает за построение полного пути к ресурсу в зависимости от настроек среды, версии приложения, выбора темы Spring и т. Д. Класс настраиваемого тега расширяет класс реализации spring: url, поэтому его можно рассматривать как обычный тег url, но с некоторыми дополнительными знаниями о правильном пути.

Моя проблема в том, что я не могу правильно разрешить $ {app.resources.path} в моей реализации пользовательского тега JSP. Пользовательские теги JSP управляются контейнером сервлетов, а не Spring, и поэтому не участвуют в DI. Поэтому я не могу просто использовать обычный @Value ("$ {app.resources.path}") и автоматически разрешить его с помощью Spring.

Все, что у меня есть, - это экземпляр контекста веб-приложения, поэтому мне нужно разрешить свое свойство программно .

Пока что я пробовал:

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");

Так что теперь я как бы застрял на этом. Любая помощь или идеи для проверки приветствуются.

37
задан Max Alexejev 2 March 2011 в 19:30
поделиться