38
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Springの@ValueでString型のデフォルト値をnullにする方法

Last updated at Posted at 2016-08-07

Spring Frameworkでは、プロパティ値(プロパティファイルやシステムプロパティの値)を取得する場合に@org.springframework.beans.factory.annotation.Valueアノテーションを使うことができます。@Valueはキーがない時のデフォルト値を指定することができますが、String型のデフォルト値をnullにするにはちょっとした工夫が必要です。

まずは、デフォルト値を指定してみる・・・

デフォルト値を指定する場合は、@Value("${キー名:デフォルト値}")という形式で指定します。

package com.example;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Component;

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
    @Component
    static class MyCommandLineRunner implements CommandLineRunner {
        @Value("${value:01}")
        String value;

        @Override
        public void run(String... args) throws Exception {
            System.out.println(value == null);
            System.out.println("value : " + value);
        }
    }
}
コンソール
false
value : 01

ちなみにキーだけ指定してみると・・・

@Value("${value}")
String value;
コンソール
...
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'value' in string value "${value}"
	at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174) ~[spring-core-4.3.0.RELEASE.jar:4.3.0.RELEASE]

キーがみつからないと、そんなプロパティないよ〜というエラーになります。

じゃあ、デフォルト値を空にしてみると・・・

@Value("${value:}")
String value;
コンソール
false
value :

nullではなく空文字になります。

それじゃ〜、デフォルト値にnullを指定すると・・・

@Value("${value:null}")
String value;
コンソール
false
value : null

当たり前ですが・・・nullという文字列が設定されます。

で・・・結局どうすればいいのかというと・・・・

デフォルト値に、SpELを使ってnull値を指定すればnull値が設定できます。(他にやり方あるのかな〜)
SpELは、「#{SpEL}」という形式で指定します。

@Value("${value:#{null}}")
String value;
コンソール
true
value : null

java.util.Optionalも使えるよ :wink:

キーがない場合(=値がnullの場合)に、状況によってデフォルト値を切り替えたりエラーにしたい場合は、Java SE 8から追加されたOptionalとして扱うとよい気がします。

@Value("${value:#{null}}")
Optional<String> value;

@Override
public void run(String... args) throws Exception {
    System.out.println("value : " + value.orElse("default1"));
    System.out.println("value : " + value.orElse("default2"));
    value.orElseThrow(() -> new IllegalStateException("value is required"));
}
コンソール

value : default1
value : default2
2016-08-07 12:55:11.833 ERROR 48919 --- [           main] o.s.boot.SpringApplication               : Application startup failed

java.lang.IllegalStateException: Failed to execute CommandLineRunner
	at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:803) [spring-boot-1.3.7.RELEASE.jar:1.3.7.RELEASE]
...
Caused by: java.lang.IllegalStateException: value is required
	at com.example.DemoApplication$MyCommandLineRunner.lambda$run$0(DemoApplication.java:27) ~[classes/:na]

文字列以外は・・・

文字列以外であれば、SpELを使わなくてもデフォルト値を空にしておけば、null値になります。ただし・・・intなどのプリミティブ型の場合は型変換エラーになるので悪しからず・・・

@Value("${value:}")
Integer value;

まとめ

特にまとめることはありませんが、ちょっとした豆知識の共有でした。
なお、Spring Bootユーザーは、@Valueではなく「Type-safe Configuration Properties」を使いましょう!! キーがなければBeanのプロパティに指定した値がデフォルト値として扱われるので、本投稿で紹介したような豆知識も不要です :smile:

38
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?