我使用 Spring Boot 開發 REST API 我有兩個具有雙向 OneToMany 的物體
產品類別
public class Product {
private Long productId;
private String name;
private String description;
private List<ProductList> productList;
public Product() {
}
public Product(Long productId, String name, String description, List<ProductList> productList) {
this.productId = productId;
this.name = name;
this.description = description;
this.productList = productList;
}
public Long getProductId() {
return productId;
}
public void setProductId(Long productId) {
this.productId = productId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public List<ProductList> getProductList() {
return productList;
}
public void setProductList(List<ProductList> productList) {
this.productList = productList;
}
ProductList class
public class ProductList {
private Long productListId;
private String productListName;
private Product product;
public ProductList(Long productListId, String productListName, Product product) {
this.productListId = productListId;
this.productListName = productListName;
this.product = product;
}
public ProductList() {
}
public Long getProductListId() {
return productListId;
}
public void setProductListId(Long productListId) {
this.productListId = productListId;
}
public String getProductListName() {
return productListName;
}
public void setProductListName(String productListName) {
this.productListName = productListName;
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
}
ProductEntity class:
@Entity
@Data
@Table(name = "PRODUCT")
public class ProductEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private Integer productId;
@Column
private String name;
@Column
private String description;
@OneToMany(cascade = CascadeType.ALL, mappedBy="product", fetch =
FetchType.EAGER)
private List<ProductListEntity> productList;
// Getters,Setters,No-ArgCOnstructor, All-ArgConstructor
ProductListEntity class:
@Table
@Entity
@Data
public class ProductListEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long productListId;
private String productListName;
@ManyToOne(fetch = FetchType.EAGER, targetEntity = ProductEntity.class)
@JoinColumn(name = "FK_Product", referencedColumnName = "productId")
private ProductEntity product;
Service to save data:
public void addProduct(Product product) {
ProductEntity productEntity = new ProductEntity();
BeanUtils.copyProperties(product, productEntity);
productRepository.save(productEntity);
}
When i try to post I get this error:
"message": "JSON parse error: Cannot construct instance of
eteosf.hexagonal.domain.model.Product(although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('string'); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance ofeteosf.hexagonal.domain.model.Product(although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('string')\n at [Source: (PushbackInputStream); line: 9, column: 18] (through reference chain: eteosf.hexagonal.domain.model.Product["productList"]->java.util.ArrayList[0]->eteosf.hexagonal.domain.model.Product$ProductList["product"])", "path": "/product"
JSON request body:
{
"productId": 0,
"name": "string",
"description": "string",
"productList": [
{
"productListId": 0,
"productListName": "string",
"product": "string"
}
]
}
uj5u.com熱心網友回復:
在您的 json_request 中,在 productList 中,您將“產品”作為“字串”發送。但是 Deserializer 不能將該字串轉換為 Product 物件。它必須作為 object 發送{}。您可以將該物件留空 - 如果它所做的只是指向自身,則不要發送它。
您基本上犯了混淆不同原則的錯誤-整個雙向關系僅適用于持久性級別。Json 請求是在控制器/視圖級別發送的,因此您不能以相同的方式顯示雙向性質。這就是您不使用物體作為控制器引數而是使用 DTO 的原因。
在您的情況下,請不要為控制器發送“產品”欄位:
{
"productId": 0,
"name": "string",
"description": "string",
"productList": [
{
"productListId": 0,
"productListName": "string",
}
]
}
并在收到引數后立即將其添加到控制器方法中:
//the receiving controller method which got Parameter `ProductEntity product`
product.getProductList().forEach(productList -> productList.setProduct(product);
就像我說的,你不應該在 Controller 方法中使用物體,它應該是一個 DTO 類以避免這種問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/445626.html
