gpt4 book ai didi

java - 名称为 'defaultReference' 的多个反向引用属性!为什么?

转载 作者:行者123 更新时间:2023-12-01 17:18:34 31 4
gpt4 key购买 nike

在 Customer 类中,我有一个 Post 方法。 Controller 和存储库中的所有内容都正确写入,我没有错误。由于某种原因,当我通过 Swagger 执行请求时,出现错误,更准确地说,警告是:

2020-04-21 14:18:39.427  WARN 5672 --- [nio-8080-exec-7] .c.j.MappingJackson2HttpMessageConverter : Failed to evaluate Jackson deserialization for type [[simple type, class com.tinychiefdelights.model.Customer]]: com.fasterxml.jackson.databind.JsonMappingException: Multiple back-reference properties with name 'defaultReference'
2020-04-21 14:18:39.428 WARN 5672 --- [nio-8080-exec-7] .c.j.MappingJackson2HttpMessageConverter : Failed to evaluate Jackson deserialization for type [[simple type, class com.tinychiefdelights.model.Customer]]: com.fasterxml.jackson.databind.JsonMappingException: Multiple back-reference properties with name 'defaultReference'
2020-04-21 14:18:39.430 WARN 5672 --- [nio-8080-exec-7] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported]

项目本身是由Spring MVC + hibernate + JPA + PostgreSql数据库编写的

在 Customer 类中,我与其他类有关系@OnetoMany @OnetoOne

客户:

package com.tinychiefdelights.model;

import com.fasterxml.jackson.annotation.JsonManagedReference;
import lombok.Data;

import javax.persistence.*;
import java.util.List;

@Data
@Entity
@Table(name = "customer", schema = "public")
public class Customer {

public Customer() { // Пустой конструктор для Hibernate

}


// Поля

// name, lastName, login, password берем от класса User через связи;

private @Id
@GeneratedValue
Long id;

@Column(name = "wallet")
private double wallet;


//Relationships
//
@OneToOne
@JoinColumn(name = "user_id", referencedColumnName = "id") // Join without Customer in User class
private User user;

//Лист заказов
@OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)
@JsonManagedReference // Таким образом я предотвратил рекурсию
private List<Order> orderList;

}

客户 Controller :

package com.tinychiefdelights.controller;

import com.tinychiefdelights.exceptions.NotFoundException;
import com.tinychiefdelights.model.Customer;
import com.tinychiefdelights.repository.CustomerRepository;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Api(value = "Работа с Заказчиком", tags = {"Заказчик"})
@RestController
public class CustomerController {

private final CustomerRepository customerRepository;

public CustomerController(CustomerRepository customerRepository) {
this.customerRepository = customerRepository;
}


// Aggregate Root
@GetMapping("/customers")
List<Customer> all(){
return customerRepository.findByUserRole("customer");
}

@PostMapping("/customers")
Customer newCustomer(@RequestBody Customer newCustomer){
return customerRepository.save(newCustomer);
}

//Single Item
@GetMapping("/customers/{id}")
Customer one(@PathVariable Long id) {
return customerRepository.findById(id)
.orElseThrow(() -> new NotFoundException(id));
}

@PutMapping("/customers/{id}")
Customer replaceCustomer(@RequestBody Customer newCustomer, @PathVariable Long id){
return customerRepository.findById(id)
.map(customer -> {
customer.setUser(newCustomer.getUser());
customer.setWallet(newCustomer.getWallet());
customer.setOrderList(newCustomer.getOrderList());
return customerRepository.save(customer);
})
.orElseGet(() -> {
newCustomer.setId(id);
return customerRepository.save(newCustomer);
});
}

@DeleteMapping("/customers/{id}")
void deleteCustomer(@PathVariable Long id){
customerRepository.deleteById(id);
}

}

订单:

package com.tinychiefdelights.model;

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import lombok.Data;

import javax.persistence.*;
import java.util.Date;
import java.util.List;

@Data
@Entity
@Table(name = "pg_order", schema = "public")
public class Order {

public Order(){ // Пустой конструктор для Hibernate

}

public Order(Customer customer, String address,
String phoneNumber, Date dateOrder, Cook cook,
List<Dish> dishes, boolean orderStatus) { // Базовый конструктор

this.customer = customer;
this.address = address;
this.phoneNumber= phoneNumber;
this.dateOrder = dateOrder;
this.cook = cook;
this.dishes = dishes;
this.orderStatus = orderStatus;
}


// Поля
private @Id @GeneratedValue Long id;

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

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

@Column(name = "date_order")
private Date dateOrder;

@Column(name = "order_status")
private boolean orderStatus;


//Relationships
//Заказчик
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JsonBackReference(value = "customer") // Таким образом я предотвратил рекурсию
private Customer customer;

//Лист блюд
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(
name = "order_dish",
joinColumns = @JoinColumn(name = "dish_id"),
inverseJoinColumns = @JoinColumn(name = "order_id"))
@JsonManagedReference(value = "order") // Таким образом я предотвратил рекурсию
private List<Dish> dishes;

//Повар
@ManyToOne(fetch= FetchType.LAZY, cascade= CascadeType.ALL)
@JsonBackReference(value = "cook") // Таким образом я предотвратил рекурсию
private Cook cook;
}

最佳答案

@JsonBackReference@JsonManagedReference 不太喜欢使用集合,因此发生错误的位置,我只是更改了 @JsonIgnore 到注释。

关于java - 名称为 'defaultReference' 的多个反向引用属性!为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61342872/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com