json - 忽略要在 JSON 响应中发送的父对象 - 循环问题 - JPA
问题描述
请耐心等待我。尽我所能用简单的示例代码来解释。
两个实体 -Shop
和Product
。
关系-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
解决方案
为避免循环问题,请使用@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;
推荐阅读
- mongodb - 如何使用 pymongo 获取第一个和最后一个日期值
- flutter - 因为 flutter_tools 依赖 sockjs_client 0.3.5 不匹配任何版本,
- maven - 在 Maven 自定义原型中获取登录用户名
- celery - 在 Celery 任务中,retry_backoff 和 retry_backoff_max 会影响手动 self.retry() 调用吗?
- c++ - 如何使 SQL 应用程序脱机工作?
- sharepoint-2013 - 使用 caml 查询添加选择
- php - 显示乱序的 Wordpress 自定义帖子之一
- c# - Unity c#如何将按钮数组中的文本与另一个int数组进行比较?
- javascript - 如何从 nodejs 中的 JSON 请求有效负载中验证和删除不需要的属性?
- mongodb - 辅助关闭时,mongodb 无法删除数据库