[英]Spring Boot JPA Hibernate: No identifier specified for entity error even when @Id is present in the entity class
[英]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.