[chapter4end] Issue: PUT endpoint fails when JSON body doesn't include id field

オープン
#5 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
1/5
見積もり時間
1時間未満
初心者へのやさしさ
55/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
停滞
技術スタック
java, spring-boot
領域
api, backend, database

調査の方向性

Start at the PUT /coffees/{id} endpoint and reproduce the request with the id in the URL but not the JSON body. Verify that the path id is assigned to the Coffee object before coffeeRepository.save(coffee), and confirm the request creates or updates successfully instead of returning the JPA exception.

索引モデルが issue の本文から書いたものです。

説明

Problem Description

The PUT /coffees/{id} endpoint throws a JpaSystemException when the request body doesn't include the id field, even though the id is provided in the URL path.

Error Message
org.hibernate.id.IdentifierGenerationException: Identifier of entity 'com.thehecklers.sbur_rest_demo.Coffee' must be manually assigned before calling 'persist()'
Root Cause

The issue occurs because:

  1. The @PathVariable String id parameter extracts the ID from the URL path (e.g., /coffees/1111id = "1111").
  2. The @RequestBody Coffee coffee object is created by Jackson from the JSON body only.
  3. These are two separate variables/objects — the URL path parameter and the request body object are independent.
  4. When the JSON body doesn't include an id field (e.g., {"name": "byecoffee"}), Jackson creates a Coffee object using the default constructor, leaving the id field as null.
  5. Hibernate/JPA requires the id field to be set before calling save(), causing the exception.
Steps to Reproduce
  1. Send a PUT request to /coffees/1111 with the following JSON body:
    {
      "name": "byecoffee"
    }
    
  2. The request fails with a 500 Internal Server Error.
Expected Behavior

The endpoint should use the id from the URL path to update or create the entity, regardless of whether the JSON body includes the id field.

Suggested Fix

Add coffee.setId(id); before calling coffeeRepository.save(coffee) to ensure the entity has the correct ID from the URL path:

@PutMapping("/{id}")
ResponseEntity<Coffee> putCoffee(@PathVariable String id,
                                 @RequestBody Coffee coffee) {
    coffee.setId(id);  // Add this line
    return (!coffeeRepository.existsById(id))
            ? new ResponseEntity<>(coffeeRepository.save(coffee),
            HttpStatus.CREATED)
            : new ResponseEntity<>(coffeeRepository.save(coffee),
            HttpStatus.OK);
}
Additional Context
  • Spring Boot version: 3.5.8
  • Using JPA with Hibernate
  • The Coffee entity uses @Id annotation without auto-generation, requiring manual ID assignment
主要言語
言語のデータがありません
スター
119
フォーク
71
PR マージ指標
30日以内にマージされた PR はありません

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

似ている issue

Backend & API Design の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。