前提・実現したいこと
java,springbootにて、POSTリクエストを受けて、なんらかの処理を実行するAPIを作成中です。
下記のように、リクエストbody内のbooleanパラメーター(以下変数bと記載します)で処理を分岐したいのですが、
null → Exception返却
false → 後続処理パターン1
true → 後続処理パターン2
変数bのvalidationで課題が発生しています。
リクエストbodyにbが入っていないときは、nullで受け取るか、その場でexceptionとしたいものです。
発生している問題
リクエスト内の有無に関わらず変数bがfalseになってしまう。
trueの場合は問題なく処理できる。
状況としては下記と一致していると思う。
[https://stackoverflow.com/questions/59458210/boolean-is-set-to-false-if-its-not-present-in-requestbody]
繰り返しになってしまうが、
リクエストbodyにbが入っていないときは、nullで受け取るか、その場でexceptionとしたい。
ex)処理として、bの値をそのまま返却するAPIをイメージ(※headerは簡略化のため割愛)
- bがtrueのとき
$ curl -XPOST -d "{\"token\" : \"hoge\" ,\"b\" : true}" http://127.0.0.1/hoge {"result":"success","b":true}
- bがfalseのとき
$ curl -XPOST -d "{\"token\" : \"hoge\" ,\"b\" : false}" http://127.0.0.1/hoge {"result":"success","b":false}
- bがbodyに存在しないとき(Exceptionに落とすのでnullになってほしいが、falseに補完されてしまう。)
$ curl -XPOST -d "{\"token\" : \"hoge\"}" http://127.0.0.1/hoge {"result":"success","b":false}
該当のソースコード
- 本体
package hoge; import 省略 @RestController @Slf4j public class Hoge{ @PostMapping(value= "/hoge",produces = MediaType.APPLICATION_JSON_VALUE) public HogeResponse entrypoint( @RequestHeader("hoge") String value, // 例では割愛したもののheaderも受けます。 @Requestbody @Validated HogeRequest body) throws Exception { // 型のvalidateも一応実施 boolean b = body.isB(); // 以下、bに依存して処理分岐したい return HogeResponse.builder().result("success").b(b).build(); } }
- HogeRequestのpojo
package hoge; import 省略 @Data public class HogeRequest { @NotBlank private String token; private boolean b; }
- Responseのpojoは今回無関係なので割愛
試したこと
stackoverflowを参考にpojo側にアノテーションを付与したが、変化なし。
- pojoにアノテーションを試してみた
@Data public class HogeRequest { @NotBlank private String token; @NotNull private boolean b; }
@Data public class HogeRequest { @NotBlank private String token; @JsonProperty(value = "b") private boolean b; }
特に変化なし。
public HogeResponse entrypointの行にeclipseでブレークポイントを付与、デバック実行でbody値を確認したところ、
リクエストにbがない場合でも、HogeRequest bodyにb=falseで渡っている様子。
Stringはnullになるのに、どうして。
@Requestbodyが勝手にfalseで補完してMappingしてしまう?
そうだったらpojoで抵抗しても無意味かと思い
- 本体にrequiredをつけてみた
package hoge; import 省略 @RestController @Slf4j public class Hoge{ @PostMapping(value= "/hoge",produces = MediaType.APPLICATION_JSON_VALUE) public HogeResponse entrypoint( @RequestHeader("hoge") String value, @Requestbody(required = true) @Validated HogeRequest body) throws Exception { // required = trueをつけてみた boolean b = body.isB(); // 以下、bに依存して処理分岐 return HogeResponse.builder().result("success").b(b).build(); } }
@Requestbodyはデフォrequired = trueらしい。意味なし。
手詰まりになってしまったので、突破方法がわかる方がいらっしゃれば、お教え願いたいと、
藁にもすがる思いです。
@Requestbodyアノテーションのbooleanデフォルト値の変更とか、できるのでしょうか。
補足情報
spring boot : 2.4.3
amazon corretto 11
回答1件
あなたの回答
tips
プレビュー