Salesforce 認定 MuleSoft デベロッパー 無料問題 4 / 10 ・ 分野4: Mule アプリケーションの構造をデザインする
Mule アプリケーションの設定に次の2行がある。 <configuration-properties file="common.yaml"/> <configuration-properties file="local.yaml"/> common.yaml には http.port: "8081"、local.yaml には http.port: "9090" が書いてある。http.port はほかのどこにも定義していない。HTTP Listener の設定 port="${http.port}" はどの値で動くか。
- 名前が重なるので、アプリケーションのデプロイがエラーで止まる
- 8081。同じ名前が複数のファイルにあるときは、最初に定義した値が残る
- どちらも使われず、プレースホルダーが文字のまま残って起動に失敗する
- 9090。あとから読み込んだファイルの値が、前の値を上書きする
正解と解説を見る
正解: B
正解の理由
configuration-properties タグは読み込むファイルごとに1つずつ書く。同じ名前のプロパティが、configuration-properties で参照した複数のファイルに定義されているときは、最初の定義が保たれる。先に書いた common.yaml の http.port: "8081" が使われ、local.yaml の 9090 は使われない。後ろのファイルで上書きするつもりで足しても効かない点が、ほかの言語の設定ファイルの感覚と違う。
違う選択肢
「9090。あとから読み込んだファイルの値が、前の値を上書きする」… configuration-properties を複数並べたときは後勝ちではない。同じ名前のプロパティが複数のファイルにあると、最初の定義が保たれる。後ろに環境ごとの上書き用ファイルを足しても、前のファイルの値は替わらない。
「名前が重なるので、アプリケーションのデプロイがエラーで止まる」… プロパティのキーが複数のファイルにあることはエラーにならない。configuration-properties で読み込んだファイルどうしで同じ名前が重なっても、デプロイは止まらず、どちらか一方の値で動く。
「どちらも使われず、プレースホルダーが文字のまま残って起動に失敗する」… どちらのファイルも src/main/resources にあり、configuration-properties で読み込まれているので、${http.port} は解決される。値が見つからない扱いにはならず、2つの定義のうち一方が使われる。
押さえどころ
環境ごとに値を替えたいときは、ファイルを足して後勝ちを狙うのではなく、file="${env}-properties.yaml" のようにファイル名そのものをプロパティで切り替えるのが公式の形である。プロパティファイルの値の型は String だけで、YAML でも .properties でも同じ扱いになる。