Spring Bootでフォームデータを扱う際の注意点
Spring Bootを使用して、コンボデータを管理するシンプルなフォームを作成していました。当初、コンボの追加機能を別ページで実装していたものを、同一ページ内で完結させようとした際に問題が発生しました。具体的には、フォームに入力したデータを保存しても、データが反映されずに空のレコードが作成されるという不具合がありました。
状況
不具合発生時のHibernateログ:
Hibernate: insert into jp_combos (damage, `explain`, input, name, startup, usagedg, usagesa) values (?, ?, ?, ?, ?, ?, ?)
Hibernate: select j1_0.id,j1_0.damage,j1_0.`explain`,j1_0.input,j1_0.name,j1_0.startup,j1_0.usagedg,j1_0.usagesa from jp_combos j1_0
このログから、データベースへの挿入は行われているものの、具体的な値がバインドされていないことがわかります。
リクエストペイロードには正しい値が含まれていましたが、それが反映されていませんでした。
解決策
問題の原因は、@PostMappingアノテーションを使用したコントローラーのメソッドaddComboのシグネチャにありました。具体的には、@ModelAttributeと@RequestBodyが同時に使用されていた点にありました。
問題のあったコード:
java
Copy code
@Transactional
@PostMapping("/combos/add")
public ResponseEntity> addCombo(@ModelAttribute @RequestBody JP_combosEntity newCombo) {
...
}
修正後のコード:
java
Copy code
@Transactional
@PostMapping("/combos/add")
public ResponseEntity> addCombo(@RequestBody JP_combosEntity newCombo) {
try {
jp_combosService.saveJP_combo(newCombo); // 新しいコンボを保存する
return ResponseEntity.ok().build(); // 成功時は200 OKを返す
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("エラーメッセージ");
}
}
@ModelAttributeアノテーションの削除により問題が解決しました。@ModelAttributeは主にフォームデータのバインディングに使用されるため、JSON形式のペイロードを扱う場合には@RequestBodyのみを使用するのが適切です。