Spring Boot: изменить идентификатор заполнителя

Каков самый простой способ изменить префикс и суффикс для заполнитель свойств Spring Spring?

По умолчанию это @Value("${some.property}") , однако это выглядит уродливым в Kotlin, так как его нужно экранировать – $ {something} является языковой функцией в шаблонах Kotlin для String.

Можно настроить префикс, используемый для объявления следующих компонентов в вашей конфигурации:

 @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 объявления @Bean .

Для тестов Spring Boot, настроенных с помощью @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) вы можете использовать @LocalServerPort вместо @Value("\${local.server.port}") .

@ConfigurationProperties будет лучшей альтернативой, особенно с классами данных Kotlin, но в настоящее время вам нужно использовать классы Kotlin с нулевыми свойствами var поскольку поддерживаются только getter / setter. Вы можете проголосовать за эту проблему или комментарий, чтобы показать свою заинтересованность в получении поддержки в Spring Boot 2.x.

Используя советы от ответа, предоставленные 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 и быть, следовательно, изменчивыми. Мне кажется, что конфигурация, как правило, статична в течение всего жизненного цикла приложения, и вместо того, чтобы добавлять сложность рассуждений о состоянии, вместо этого вводится неизменяемый интерфейс.

У них есть новая функция, использующая классы java, аннотированные с помощью @ConfigurationProperties . Это хорошо выглядит в Котлине, а рефакторинг сохраняется. Вы должны попробовать:

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