背景
フロントエンドと分業して作業していると、思ってたのと違うリクエストが飛んでくることがたまにある。
バックエンド「使わないプロパティは値を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の場合と一緒ですね。
結論
リクエストにフォームオブジェクトのプロパティが無かった場合は、変数宣言時と同じ初期値が入る。