Есть еще одно возможное решение: сделать классы тегов @Configurable через AspectJ и включить ткачество во время компиляции или во время загрузки. Затем я мог использовать обычные аннотации Spring @Value в своих пользовательских тегах. Но на самом деле я не хочу создавать ткацкую инфраструктуру только из-за пары занятий. Все еще ищем способ разрешить заполнитель через ApplicationContext.
тоящее время я работаю над веб-приложением на основе 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");
Так что теперь я застрял с этим. Я знаю, что возможность определения моего заполнителя находится где-то в контексте, я просто не знаю, как это сделать.
Любая помощь или идеи для проверки высоко ценятся.