В настоящее время я работаю над веб-приложением на основе 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 в моих шаблонах JSP 2.1. Этот тег отвечает за создание полного пути ресурса в зависимости от настроек среды, версии приложения, выбора темы 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");
Так что теперь я застрял с этим. Я знаю, что возможность определения моего заполнителя находится где-то в контексте, я просто не знаю, как это сделать.
Любая помощь или идеи для проверки высоко ценятся.