Spring Boot:更改属性占位符符号

Posted

技术标签:

【中文标题】Spring Boot:更改属性占位符符号【英文标题】:Spring Boot: Change property placeholder signifier 【发布时间】:2016-02-22 14:35:27 【问题描述】:

在 Spring Boot 中更改属性占位符的前缀和后缀的最简单方法是什么?

默认是@Value("$some.property"),但是这在 Kotlin 中看起来很难看,因为它需要被转义 - $something 是 Kotlin 中用于字符串模板的语言特性。

【问题讨论】:

我很确定您将无法做到这一点,因为这是在 SpEL 中定义的(继承自一般 EL)。 Kotlin 是否没有与 Groovy 的单引号“不插值”字符串等效的功能? 当然,你总是可以使用@ConfigurationProperties 【参考方案1】:

可以通过在配置中声明以下 bean 来自定义使用的前缀:

@Bean
fun propertyConfigurer() = PropertySourcesPlaceholderConfigurer().apply 
    setPlaceholderPrefix("%")

如果您有任何使用 $... 语法的现有代码(如 Spring Boot 执行器或 @LocalServerPort),则应声明:

@Bean
fun kotlinPropertyConfigurer() = PropertySourcesPlaceholderConfigurer().apply 
    setPlaceholderPrefix("%")
    setIgnoreUnresolvablePlaceholders(true)


@Bean
fun defaultPropertyConfigurer() = PropertySourcesPlaceholderConfigurer()

@Value("\$some.property") 那样转义美元是另一种可能的选择,不需要@Bean 声明。

对于使用 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 配置的 Spring Boot 测试,您可以使用 @LocalServerPort 而不是 @Value("\$local.server.port")

@ConfigurationProperties 会是更好的选择,尤其是 Kotlin 数据类,但目前您必须使用具有可空 var 属性的 Kotlin 类,因为仅支持 getter/setter。您可以为 this issue 投票或发表评论以表明您有兴趣在 Spring Boot 2.x 中获得支持。

【讨论】:

是否可以将@ConfigurationProperties 与 Kotlin 数据类一起使用,还是必须是常规的开放类? 问题是构造函数注入。如果您尝试在构造函数中创建属性,Spring 会搜索 bean 而不是配置属性。 @Sébastien Deleuze 有没有办法为 ConfigurationProperties 类禁用 bean 注入? Spring Boot 1.x 不支持,我们正在讨论在 Spring Boot 2.x 中支持它:github.com/spring-projects/spring-boot/issues/8762。【参考方案2】:

他们有一个使用带有@ConfigurationProperties 注释的java 类的新特性。这在 Kotlin 中看起来不错,并且正在重构保存。你应该试一试:

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-typesafe-configuration-properties

【讨论】:

我认为this link 是该功能的更好入口点。也许你可以用它来编辑你的答案? 在您的帮助下,我找到了一个令我满意的解决方案(见下文)。谢谢。 酷。看来你有很多想法要做才能让它运行。如果您在答案中加上“勾号”,我可以。我已经投票了 接受了新的答案,专门解决了这个问题,但再次感谢您的帮助 - 我正在继续 @ConfigurationProperties【参考方案3】:

使用 dox 提供的答案的建议,我最终得到了类似的结果:

public interface TokenAuthenticationConfig 

public fun apiKey() : String



@Component
@ConfigurationProperties(prefix = "service.api")
public open class TokenAuthenticationConfigImpl : TokenAuthenticationConfig

    public var apiKey : String

    constructor() 
        this.apiKey = ""
    

    override fun apiKey(): String
    
        return this.apiKey
    

在 Spring 中,@ConfigurationProperties 对象需要遵循 Java Beans 模式,因此是可变的。对我来说,配置似乎应该在整个应用程序生命周期中通常是静态的,因此与其增加推理状态的复杂性,不如注入不可变接口。

【讨论】:

以上是关于Spring Boot:更改属性占位符符号的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 配置属性的未解决占位符验证

使用 Spring Boot 进行 Maven 资源过滤:无法解析占位符

如果 Spring Boot 的属性文件中未提供占位符值,如何跳过?

带有弹簧属性占位符的 Spring Boot 和 Logback logging.config 文件

如何为具有属性依赖项的 Spring Boot Application 类编写测试用例 - 无法解析占位符

如何使用 Spring Boot 应用程序中另一个属性文件中的值解析属性文件中的占位符