LoginSignup
2
1

不要な@ModelAttributeに四苦八苦した備忘録

Last updated at Posted at 2024-03-22

Spring Bootでフォームデータを扱う際の注意点

image.png

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のみを使用するのが適切です。

2
1
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
2
1