gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:05:11 26 4
gpt4 key购买 nike

我目前正在开发一个基于 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");

所以现在我有点坚持。我知道解决占位符的能力是在上下文中的某个地方,我只是不知道正确的方法。
任何帮助或检查的想法都非常感谢。

最佳答案

自 Spring 3.0.3 以来,EmbeddedValueResolverAware 的工作方式与另一篇使用 appContext.getBeanFactory().resolveEmbeddedValue("${prop}") 调用的帖子中提到的相同。

解决问题:

  1. 让你的类实现 EmbeddedValueResolverAware 接口(interface),你会为你注入(inject)解析器

  2. 然后,您将可以在哪里检索属性,如代码片段所示:

    String propertyValue = resolver.resolveStringValue("${your.property.name}");

那么你的 bean 就不需要依赖 ApplicationContext 来检索你需要的属性了。

关于spring - 如何在 Spring 中以编程方式解析属性占位符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5172392/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com