首页 > 解决方案 > 忽略要在 JSON 响应中发送的父对象 - 循环问题 - JPA

问题描述

请耐心等待我。尽我所能用简单的示例代码来解释。

两个实体 -ShopProduct

关系-AShop可以有很多Product

我返回一个 Shop 对象,它一直像这样打印 -

{
    "shopId": 1,
    "shopName": "S1",
    "productList": [
        {
            "productId": 100,
            "productName": "MOBILE",
            "shop": {
                "shopId": 1,
                "shopName": "S1",
                "productList": [
                    {
                        "productId": 100,
                        "productName": "MOBILE",
                        "shop": {

在我开始实际问题之前,我确实部分解决了循环问题,但遇到了一个新问题。我在@JsonIgnore

基本上,当我打印我的 parent( Shop) json 对象时,我通过@JsonIgnore在 child( Product) 类字段中使用来停止循环响应。

@JsonIgnore 
private Shop shop

所以,现在 API 1 =

@GetMapping("/getShopById")
    public Shop getShopById(){
        return shopRepo.findById(1L).get();
    }

给我输出 - (这是完美的,因为我避免打印Shop回来);

{
    "shopId": 1,
    "shopName": "S1",
    "productList": [
        {
            "productId": 100,
            "productName": "MOBILE"
        },
        {
            "productId": 101,
            "productName": "EARPHONE"
        }
    ]
}

但是现在任何时候我想Shop从一个Product对象中获取并发送响应我都会得到一个错误,这是因为@JsonIgnore我猜,这基本上完全停止了从Product对象中对字段的序列化。

API 2 =

@GetMapping("/getShopFromTheProductId")
    public Shop getShopFromProductId() {
        Shop s = productRepo.findById(100L).get().getShop();
        return s;
    }

给我错误 -


com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.doubt.StackOverFlow.Shop$HibernateProxy$YEW0qvzw["hibernateLazyInitializer"])
    at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) ~[jackson-databind-2.12.3.jar:2.12.3]
    at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1276) ~[jackson-databind-2.12.3.jar:2.12.3]
    at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400) ~[jackson-databind-2.12.3.jar:2.12.3]
    at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty

因此,总结一下,除非我明确要求,否则我如何才能忽略打印/从 Child 返回父级?

可能的解决方案 1 -从实体中删除Shop( )的吸气剂。但这对我来说不是一个解决方案,因为当我在业务逻辑中可能需要它时,我将永远无法追踪到父级。private Shop getShop()Product

我的课程 -

控制器 -

@RestController
public class MainController {

    @Autowired
    private ShopRepo shopRepo;
    @Autowired
    private ProductRepo productRepo;
    
    @GetMapping("/getShopById")
    public Shop getShopById(){
        return shopRepo.findById(1L).get();
    }
    
    @GetMapping("/getShopFromTheProductId")
    public Shop getShopFromProductId() {
        Shop s = productRepo.findById(100L).get().getShop();
        return s;
    }
}

店铺实体 -

@Entity
@Table(name = "SHOP")
public class Shop {

    @Id
    @Column(name = "SHOP_ID")
    private Long shopId;
    
    @Column(name = "SHOP_NAME")
    private String shopName;
    
    @OneToMany(fetch = FetchType.LAZY,targetEntity = Product.class, mappedBy = "shop")
    private List<Product> productList;
........

all the getters and setters

产品实体 -

@Entity
@Table(name = "PRODUCT")
public class Product {

    @Id
    @Column(name = "PRODUCT_ID")
    private Long productId;
    
    @Column(name = "PRODUCT_NAME")
    private String productName;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "SHOP_ID")
    @JsonIgnore
    private Shop shop;
........
all getters and setters

标签: jsonspring-bootspring-data-jpacyclic-reference

解决方案


为避免循环问题,请使用@JsonManagedReference、@JsonBackReference,如下所示。

在父类、商店实体上添加@JsonManagedReference。

@JsonManagedReference
@OneToMany(fetch = FetchType.LAZY,targetEntity = 
Product.class, mappedBy = "shop")
private List<Product> productList;

在子类上添加@JsonBackReference,如下所示。

@JsonBackReference
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "SHOP_ID")
@JsonIgnore
private Shop shop;

推荐阅读