Spring Boot无限递归

时间:2018-04-30 05:46:38

标签: json hibernate jpa jackson spring-data-jpa

我正在使用JpaRepository处理Spring Boot项目。当我尝试从控制器读取记录时,它给了我奇怪的巨大JSON响应。

我确信这是由映射引起的。

这是我的代码:

实体:客户

com.arj.entity.Customer

@Entity
@Table(name = "customers")
public class Customer {
@SuppressWarnings("unused")
private static final long serialVersionUID = 4910225916550731446L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private Long id;

@Column(name = "name", length = 256)
private String name;

@Column(name = "email", length = 256)
private String email;

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

@OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)
private Set<CustomerAddress> customerAddresses = new HashSet<CustomerAddress>();

@OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)
private List<Order> orders;

@Column(name = "date_created")
@Temporal(TemporalType.TIMESTAMP)
private Date dateCreated;

@Column(name = "is_active", columnDefinition = "BIT default 1", length = 1, nullable = false)
private boolean isActive;

getters and setters ...
}

实体:经销商

com.arj.entity.Dealer

@Entity
@Table(name = "dealers")
public class Dealer {
@SuppressWarnings("unused")
private static final long serialVersionUID = 4910225916550731446L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private Long id;

@Column(name = "name", length = 256)
private String name;

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

@OneToMany(mappedBy = "dealer", cascade = CascadeType.ALL)
private Set<Order> orders = new HashSet<Order>();

@Column(name = "date_created")
@Temporal(TemporalType.TIMESTAMP)
private Date dateCreated;

@Column(name = "is_active", columnDefinition = "BIT default 1", length = 1, nullable = false)
private boolean isActive;

getters and setters ...
}

实体:订单

com.arj.entity.Order

@Entity
@Table(name = "orders")
public class Order {
@SuppressWarnings("unused")
private static final long serialVersionUID = 4910225916550731446L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private Long id;

@Column(name = "date_created")
@Temporal(TemporalType.TIMESTAMP)
private Date dateCreated;

@Column(name = "is_active", columnDefinition = "BIT default 1", length = 1, nullable = false)
private boolean isActive;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "customer_id")
private Customer customer;

@ManyToOne(optional = true, fetch = FetchType.LAZY)
@JoinColumn(name = "dealer_id", nullable = true)
private Dealer dealer;

getters and setters ...
}

OrderRepository

com.arj.repository.OrderRepository

@RepositoryRestResource
public interface OrderRepository extends JpaRepository<Order, Long> {
    @Query(value = "SELECT t FROM Order t WHERE t.status = :status")
    public List<Order> getAllOrdersByStatus(@Param("status") String status);
}

OrderController

com.arj.controller.api.OrderController

@RestController
@RequestMapping("/api/v1/order")
public class OrderController {
@Autowired
OrderRepository orderRepository;

@RequestMapping(value = "/type/{status}", method = RequestMethod.GET)
public ResponseEntity<List<Order>> getAllOrdersByStatus(@PathVariable("status") String status) {
    List<Order> orders = orderRepository.getAllOrdersByStatus(status);
    if (orders.isEmpty()) {
        System.out.println("Orders empty");
        return new ResponseEntity<List<Order>>(HttpStatus.NO_CONTENT);
    }

    return new ResponseEntity<List<Order>>(orders, HttpStatus.OK);
}
}

我收到以下消息:

  

&#34; status&#34;:200,&#34; error&#34;:&#34; OK&#34;,&#34; message&#34;:&#34;无法写入JSON:无限递归(StackOverflowError);嵌套异常是com.fasterxml.jackson.databind.JsonMappingException:无限递归(StackOverflowError)(通过引用链:com.aata.entity.Order [\&#34; customer \&#34;] - &gt; com.aata。 entity.Customer _ _ $$ jvsteb5_c [\&#34;订单\&#34;] - &GT; org.hibernate.collection.internal.PersistentBag [0] - &GT; com.aata.entity.Order [\&#34;客户\&#34;] - &GT; com.aata.entity.Customer _ _ $$ jvsteb5_c [\&#34;订单\&#34;

客户有OneToMany的订单
客户订单ManyToOne

如果我选择customer,我也想选择orders 如果我选择order,我也想显示customer

0 个答案:

没有答案