一尘不染

如何在Spring中以编程方式解析属性占位符

jsp

我目前在基于Spring 3.1.0.M1的Web应用程序上工作,基于注释,并且在应用程序的一个特定位置解析属性占位符时遇到问题。

这是故事。

1)在我的Web应用程序上下文中(由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标签,但具有有关正确路径的一些附加知识。

我的问题是我无法在JSP自定义标记实现中正确解析$
{app.resources.path}。JSP自定义标签是由servlet容器而不是Spring管理的,因此不参与DI。所以我不能只使用通常的@Value(“
$ {app.resources.path}”)并由Spring自动解决它。

我所拥有的只是Web应用程序上下文实例,因此我必须以编程方式解析我的属性。

到目前为止,我尝试了:

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

所以现在我有点坚持了。我知道解析占位符的能力就在上下文中,我只是不知道正确的方法。
任何帮助或想法检查,我们高度赞赏。


阅读 249

收藏
2020-06-08

共1个答案

一尘不染

我认为您可以只定义一个新的util:properties,而不是着眼于上下文占位符的内部工作:

<util:properties id="appProperties" location="classpath:app.properties" />

并在您的代码中像这样使用它:

Properties props = appContext.getBean("appProperties", Properties.class);

或像这样在任何可以做DI的地方:

@Value("#{appProperties['app.resources.path']}")
2020-06-08