簡體   English   中英

Spring 啟動 JPA 從其他實體檢索 ID 時出現反序列化問題

[英]Spring boot JPA deserialization problem when retrieving ID from other entity

I'm creating a web program to map stores occupation levels with spring boot, tomcat and JPA. 我已經創建了成員模型/服務/控制器,當我嘗試對其進行更新、創建、刪除或從中獲取信息時,它可以正常工作。

然而,商店也沒有被創建,當我使用 ownerId 創建商店時,我收到一條錯誤消息:

錯誤信息

[org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of com.project.so2.models.Member (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('1'); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of com.project.so2.models.Member (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('1') 在 [Source: (PushbackInputStream); 行:4,列:18](通過參考鏈:com.project.so2.models.Store["owner_id"])]

我試圖查找類似的問題,但我還沒有看到任何適用的解決方案。

楷模

專賣店

@Entity(name = "Store")
@Table(name = "store")
@SequenceGenerator(name = "store_id")
public class Store {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "store_id")
    @Column(name = "id")
    private long id;

    //many stores to one owner
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JoinColumn(name = "owner_id", referencedColumnName = "id")
    private Member owner_id;
    
    //one store to many occupation level
    @OneToMany(mappedBy = "store")
    private List<Occupation> store_occupation;
    
    @OneToOne(mappedBy = "store")
    private Location location;

    @Column(name = "name")
    private String name;

    @Column(name = "square_footage")
    private String square_footage;

    public Store() {
    }

成員

@Entity(name = "Member")
@Table(name = "member")
@SequenceGenerator(name = "member_id")
public class Member {
    
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "member_id")
    @Column(name = "id")
    private long id;
    
    @Enumerated(EnumType.STRING)
    @Column(name = "role")    
    private Role role;//customer|admin|store_owner
    
    @Column(name = "mail", unique = true)
    private String mail;
    
    @Column(name = "name")
    private String name;

    @OneToMany(mappedBy = "owner_id")
    private List<Store> stores;
    
    
    
    /**
     * REALM to store passwords
     */
    
    @CreationTimestamp
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date createdAt;
    
    @UpdateTimestamp
    private Date updateAt;

店鋪 controller

@RestController
@RequestMapping("/store")
@ControllerAdvice()
@CrossOrigin
public class StoreController {
    @Autowired
    private StoreService storeservice;

    @PostMapping("/create")
    public ResponseEntity<HttpStatus> createStore(@RequestBody Store store) {
        try {
            this.storeservice.saveStore(store);
            return new ResponseEntity<>(HttpStatus.CREATED);
        } catch (Exception e) {
            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

門店服務

@Service
public class StoreService {
    
    @Autowired
    private StoreRepository storeRepository;//

    public void saveStore(Store store) {
        this.storeRepository.save(store); 
    }

請求有效載荷:

{
    "name": "Pingo Azedo",
    "square_footage": "25m^2",
    "owner_id":{
        "member_id": "1"
    }
}

老實說,我不明白這個問題,也不知道如何解決它。 如果有人可以提供幫助,將不勝感激!

您正在嘗試從 json 反序列化成員,但 jackson 不知道如何僅使用“member_id”填寫此成員,並且錯誤很明顯是“找不到帶有字符串的構造函數”。 因此,為了獲取會員 ID,您需要添加新的 class 請求 dto,例如:

String name;
String footage;
Long owner_id;

在您的 controller 中使用您的新 class,現在使用 owner_id,使用存儲庫在您的數據庫中找到它,然后將其設置到您的商店。

您需要在有效負載中使用屬性名稱,而不是列名稱。 更改您的請求有效負載,如下所示,

{
  "name": "Pingo Azedo",
  "square_footage": "25m^2",
  "owner_id":{
       "id" : 1
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM