You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring @Value注解无法解析属性占位符,显示原始表达式求助

我遇到过类似的问题,当@Value注入返回占位符而Environment能正确获取值时,通常是占位符解析器没有生效或者配置类的注解使用逻辑有问题。下面是几个可行的解决方案:

1. 显式注册PropertySourcesPlaceholderConfigurer Bean

@Value的占位符替换依赖PropertySourcesPlaceholderConfigurer这个核心Bean,在非Spring Boot环境或自定义配置扫描逻辑下,Spring可能不会自动注册它。你可以在一个@Configuration类中手动添加这个Bean:

@Configuration
@PropertySource({"classpath:/properties/mail.properties"})
public class AppConfig {
    // 必须是static方法,确保它在其他Bean初始化前被创建
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

这个Bean会负责解析@Value中的占位符,将其替换为配置文件中的实际值。

2. 改用@ConfigurationProperties替代@Value

Spring Boot推荐使用@ConfigurationProperties来批量绑定配置属性,这种方式更稳定,也能避免@Value的解析异常。修改你的ResourcesProperties类:

@Component
@ConfigurationProperties(prefix = "email.content")
public class ResourcesProperties {
    // 属性名与配置文件的后缀对应(charset对应email.content.charset)
    private String charset;

    // 必须提供setter方法,Spring通过setter注入属性值
    public void setCharset(String charset) {
        this.charset = charset;
    }

    public String getCharset() {
        return charset;
    }
}

配置完成后,Spring会自动把mail.properties中email.content.charset的值绑定到charset属性上,无需再使用@Value。

3. 检查@PropertySource的放置位置

确保@PropertySource注解放在被Spring扫描的@Configuration类上,而非普通的@Component类中。虽然Environment能读取到配置,但@Value的解析依赖配置文件的加载顺序——把@PropertySource移到专门的配置类中,能确保配置文件在Bean初始化前被加载完成。

验证方法

修改后重启应用,调用properties.getCharset()(如果用了@ConfigurationProperties)或properties.getEmailCharset(),应该就能正确获取到utf-8了。

内容的提问来源于stack exchange,提问作者袙褟褔械褋谢邪胁 效械褉薪褘褕芯胁

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:23:25