Есть еще одно возможное решение: сделать классы тегов @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");

Так что теперь я застрял с этим. Я знаю, что возможность определения моего заполнителя находится где-то в контексте, я просто не знаю, как это сделать.
Любая помощь или идеи для проверки высоко ценятся.

Ответы на вопрос(5)

Ваш ответ на вопрос