Edited at

Spring リクエストにフォームオブジェクトのプロパティが無い場合の初期値


背景

フロントエンドと分業して作業していると、思ってたのと違うリクエストが飛んでくることがたまにある。

バックエンド「使わないプロパティは値をnullにして送ってきてね!」

フロントエンド「使わないプロパティはキー無しで送るようにしました!」

・・・プロパティ無かった場合って、変数に何が入るんだっけ?


確認

Spring Boot 2.0.5 で確認してます

せっかくなので、色んな型で確認してみた。

フォームクラス


public class TestRequest {

// 基本データ型
byte reqByte;
short reqShort;
int reqInt;
long reqLong;
float reqFloat;
double reqDouble;
char reqChar;
boolean reqBoolean;

// 参照型
Byte reqByteWrapper;
Short reqShortWrapper;
Integer reqIntWrapper;
Long reqLongWrapper;
Float reqFloatWrapper;
Double reqDoubleWrapper;
Character reqCharWrapper;
Boolean reqBooleanWrapper;
String reqString;
Object reqObject;
}


POSTの場合

コントローラ


@RestController
@RequestMapping("/api/test")
public class TestController {

@PostMapping("/post")
public void postTest(@RequestBody TestRequest request) {
System.out.println("byte: " + request.getReqByte());
System.out.println("short: " + request.getReqShort());
System.out.println("int: " + request.getReqInt());
System.out.println("long: " + request.getReqLong());
System.out.println("float: " + request.getReqFloat());
System.out.println("double: " + request.getReqDouble());
System.out.println("char: " + request.getReqChar());
System.out.println("boolean: " + request.isReqBoolean());
System.out.println("Byte: " + request.getReqByteWrapper());
System.out.println("Short: " + request.getReqShortWrapper());
System.out.println("Integer: " + request.getReqIntWrapper());
System.out.println("Long: " + request.getReqLongWrapper());
System.out.println("Float: " + request.getReqFloatWrapper());
System.out.println("Double: " + request.getReqDoubleWrapper());
System.out.println("Character: " + request.getReqCharWrapper());
System.out.println("Boolean: " + request.getReqBooleanWrapper());
System.out.println("String: " + request.getReqString());
System.out.println("Object: " + request.getReqObject());
}
}

このコントローラに対し、プロパティ無しのJSONをPOSTで投げてみる。

結果

byte: 0

short: 0
int: 0
long: 0
float: 0.0
double: 0.0
char:
boolean: false
Byte: null
Short: null
Integer: null
Long: null
Float: null
Double: null
Character: null
Boolean: null
String: null
Object: null

変数宣言した時の初期値と同じ値が入っていますね。

参照型はnullが入るので、リクエストJSONのプロパティ値がnullの時と同じです。


GETの場合

GETでも同じことやってみました。

コントローラ


@RestController
@RequestMapping("/api/test")
public class TestController {

@GetMapping("/get")
public void getTest(TestRequest request) {
System.out.println("byte: " + request.getReqByte());
System.out.println("short: " + request.getReqShort());
System.out.println("int: " + request.getReqInt());
System.out.println("long: " + request.getReqLong());
System.out.println("float: " + request.getReqFloat());
System.out.println("double: " + request.getReqDouble());
System.out.println("char: " + request.getReqChar());
System.out.println("boolean: " + request.isReqBoolean());
System.out.println("Byte: " + request.getReqByteWrapper());
System.out.println("Short: " + request.getReqShortWrapper());
System.out.println("Integer: " + request.getReqIntWrapper());
System.out.println("Long: " + request.getReqLongWrapper());
System.out.println("Float: " + request.getReqFloatWrapper());
System.out.println("Double: " + request.getReqDoubleWrapper());
System.out.println("Character: " + request.getReqCharWrapper());
System.out.println("Boolean: " + request.getReqBooleanWrapper());
System.out.println("String: " + request.getReqString());
System.out.println("Object: " + request.getReqObject());
}
}

このコントローラに対し、リクエストパラメータ無しでGETでリクエストしてみます。

結果

byte: 0

short: 0
int: 0
long: 0
float: 0.0
double: 0.0
char:
boolean: false
Byte: null
Short: null
Integer: null
Long: null
Float: null
Double: null
Character: null
Boolean: null
String: null
Object: null

POSTの場合と一緒ですね。


結論

リクエストにフォームオブジェクトのプロパティが無かった場合は、変数宣言時と同じ初期値が入る。