Springブートでプロパティプレースホルダのプレフィックスとサフィックスを変更する最も簡単な方法は何ですか?Springブート:プロパティのプレースホルダ記号を変更する
デフォルトは@Value("${some.property}")
ですが、$ {something}はKotlin for Stringテンプレートの言語機能です。これはエスケープする必要があるため、Kotlinでは醜いようです。
Springブートでプロパティプレースホルダのプレフィックスとサフィックスを変更する最も簡単な方法は何ですか?Springブート:プロパティのプレースホルダ記号を変更する
デフォルトは@Value("${some.property}")
ですが、$ {something}はKotlin for Stringテンプレートの言語機能です。これはエスケープする必要があるため、Kotlinでは醜いようです。
あなたの設定で次のBeanを宣言することによって使用される接頭辞をカスタマイズすることが可能である:
@Bean
fun propertyConfigurer() = PropertySourcesPlaceholderConfigurer().apply {
setPlaceholderPrefix("%{")
}
あなたが${...}
構文を使用している(春ブーツアクチュエータや@LocalServerPort
のような)既存のコードを持っている場合、あなた宣言する必要があります。
@Bean
fun kotlinPropertyConfigurer() = PropertySourcesPlaceholderConfigurer().apply {
setPlaceholderPrefix("%{")
setIgnoreUnresolvablePlaceholders(true)
}
@Bean
fun defaultPropertyConfigurer() = PropertySourcesPlaceholderConfigurer()
@Value("\${some.property}")
でのようにドルをエスケープしても@Bean
宣言を必要としない別の可能な選択肢です。
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
で設定されたスプリングブートテストでは、@Value("\${local.server.port}")
の代わりに@LocalServerPort
を使用できます。
@ConfigurationProperties
は、特にKotlinデータクラスの方が優れていますが、getter/setterのみがサポートされているため、現在はnullのvar
プロパティでKotlinクラスを使用する必要があります。 this issueに投票するか、コメントして、Spring Boot 2.xでサポートされていることに興味を持ってください。
Kotlinデータクラスで@ConfigurationPropertiesを使用することはできますか? – AAverin
問題はコンストラクタインジェクションです。コンストラクタでプロパティを作成しようとすると、Springは設定プロパティの代わりにBeanを検索します。 @SébastienDeleuzeには、ConfigurationPropertiesクラスのBeanインジェクションを無効にする方法がありますか? –
TheはSpring Boot 1ではサポートされていません。xでは、Spring Boot 2.xのサポートについてはhttps://github.com/spring-projects/spring-boot/issues/8762で議論しています。 –
これらは、@ConfigurationProperties
と注釈されたJavaクラスを使用する新しい機能を備えています。これはKotlinでうまく見え、セーブをリファクタリングしています。あなたはそれを試してみる必要があります:DOXによって提供さ答えからの助言を使用して
私は[このリンク](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-typesafe-configuration-properties)はより良いエントリだと思いますフィーチャーのポイント。あなたはそれであなたの答えを編集できますか? –
あなたの助けを借りて、私が満足している解決策を見つけました(下記参照)。ありがとうございました。 –
クール。あなたはそれを実行させるために多くのことを考えていたようです。私はあなたの答えに "ダニ"を入れれば大丈夫です。私はすでにそれをupvotedしました – d0x
を、私のようなものと一緒に行くことになった:
春に@ConfigurationProperties
オブジェクトは、Java Beansのに従う必要があり
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
}
}
したがって、変更可能である必要があります。私の設定には、アプリのライフサイクル全体を通して静的でなければならないかのように思えます。そのため、状態についての推論の複雑さを追加するのではなく、不変のインターフェースを注入しました。
SpEL(一般的なELから継承)で定義されているように、あなたはそれを行うことができないと確信しています。 KotlinはGroovyの一重引用符「補間しない」と同等の文字列を持っていませんか? – chrylis
もちろん、@ConfigurationPropertiesを使用することもできます。 – chrylis