2015-11-20 8 views
8

Springブートでプロパティプレースホルダのプレフィックスとサフィックスを変更する最も簡単な方法は何ですか?Springブート:プロパティのプレースホルダ記号を変更する

デフォルトは@Value("${some.property}")ですが、$ {something}はKotlin for Stringテンプレートの言語機能です。これはエスケープする必要があるため、Kotlinでは醜いようです。

+0

SpEL(一般的なELから継承)で定義されているように、あなたはそれを行うことができないと確信しています。 KotlinはGroovyの一重引用符「補間しない」と同等の文字列を持っていませんか? – chrylis

+1

もちろん、@ConfigurationPropertiesを使用することもできます。 – chrylis

答えて

20

あなたの設定で次の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でサポートされていることに興味を持ってください。

+0

Kotlinデータクラスで@ConfigurationPropertiesを使用することはできますか? – AAverin

+0

問題はコンストラクタインジェクションです。コンストラクタでプロパティを作成しようとすると、Springは設定プロパティの代わりにBeanを検索します。 @SébastienDeleuzeには、ConfigurationPropertiesクラスのBeanインジェクションを無効にする方法がありますか? –

+0

TheはSpring Boot 1ではサポートされていません。xでは、Spring Boot 2.xのサポートについてはhttps://github.com/spring-projects/spring-boot/issues/8762で議論しています。 –

1

これらは、@ConfigurationPropertiesと注釈されたJavaクラスを使用する新しい機能を備えています。これはKotlinでうまく見え、セーブをリファクタリングしています。あなたはそれを試してみる必要があります:DOXによって提供さ答えからの助言を使用して

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

+0

私は[このリンク](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-typesafe-configuration-properties)はより良いエントリだと思いますフィーチャーのポイント。あなたはそれであなたの答えを編集できますか? –

+0

あなたの助けを借りて、私が満足している解決策を見つけました(下記参照)。ありがとうございました。 –

+0

クール。あなたはそれを実行させるために多くのことを考えていたようです。私はあなたの答えに "ダニ"を入れれば大丈夫です。私はすでにそれをupvotedしました – d0x

2

を、私のようなものと一緒に行くことになった:

春に @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 
    } 
} 

したがって、変更可能である必要があります。私の設定には、アプリのライフサイクル全体を通して静的でなければならないかのように思えます。そのため、状態についての推論の複雑さを追加するのではなく、不変のインターフェースを注入しました。

関連する問題