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 进行 Maven 资源过滤:无法解析占位符
如果 Spring Boot 的属性文件中未提供占位符值,如何跳过?
带有弹簧属性占位符的 Spring Boot 和 Logback logging.config 文件