spring中@Value("${key}")值原样输出${key}分析与解决
问题:
最近发现一个项目中,在类中通过@Value("${key}")获取配置文件中变量值突然不行了,直接输出${key},示例代码如下:
java类中:
1 2 3 4 | import org.springframework.beans.factory.annotation.Value; @Value ( "${recharge.uri}" ) private String rechargeUri; |
application.properties配置文件中:
1 | recharge.uri=http: //xxx.com/project-name/recharge/fetch.do |
applicationContext.xml文件中配置如下:
1 2 | <context:property-placeholder location= "WEB-INF/application.properties" ignore-unresolvable= "true" /> |
web.xml中配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <!--Spring ApplicationContext载入,不指定配置文件名则默认为applicationContext.xml --> <listener> <listener- class >org.springframework.web.context.ContextLoaderListener</listener- class > </listener> <!--SpringMVC配置,不指定配置文件名则默认为[servlet-name]-servlet.xml,即dispatcher-servlet.xml --> <servlet> <servlet-name>dispatcher</servlet-name> <servlet- class >org.springframework.web.servlet.DispatcherServlet</servlet- class > <load-on-startup> 1 </load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping> |
当项目运行时,变量rechargeUri直接输出了${recharge.uri}这个字符串,而不是我配置文件中定义的http://xxx.com/project-name/recharge/fetch.do。
通过网上查资料,发现如果spring和springmvc并存的情况时,有以下规则:
1.Spring 允许在父子继承关系中定义多个上下文
2.applicationContext.xml 文件是为了“根webapp应用上下文”定义bean,也就是说它的上下文是和webapp相关联的
3.spring-servlet.xml文件是为了一个servlet 应用上下文定义bean,在一个webapp中可以有多个此配置文件
4.每个springmvc的配置文件[servlet-name]-servlet.xml对应一个web.xml中的servlet定义(例如: 名为spring1的servlet拥有配置文件spring1-servlet.xml, 名为spring2的servlet拥有配置文件spring2-servlet.xml).
5.当存在多个springmvc配置文件时,他们是不能互相访问的。
6.SpringMVC的配置文件中可以直接用id引入spring配置文件中定义的bean,但是反过来不可以。
注:对于ignore-unresolvable="true",当加载多个property-placeholder时,第一个property-placeholder时出现解析不了的占位符会忽略掉,由后面property-placeholder进行解析。
解决方法:
对于我这种情况,就是要在dispatcher-servlet.xml中添加application.properties的载入。
dispatcher-servlet.xml
1 | <context:property-placeholder location= "WEB-INF/application.properties" /> |
重新发布项目后,可以正常获取变量值。
参考文章:https://blog.csdn.net/zuoyixiao/article/details/54288329
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
2018-03-08 快速排序(比较简练的实现)