RESTEASY008205:JSON 绑定序列化错误 jakarta.json.bind.JsonbException:无法从 shop.ShippingCompany 序列化属性“coveredRegions”错误,因为 ShippingCompany 表与表 region_company 中的 CoveredRegion 连接 我如何解决@get
中的这个错误@Path("/getAllShippingCompany")
public List<ShippingCompany> getAllShippingCompany() {
return entityManager.createQuery("SELECT c FROM ShippingCompany c", ShippingCompany.class).getResultList();
}
我期望得到所有公司,但因为 ShippinCompany 与 CoveredRegion 一起工作,所以我尝试了以下方法:
@GET
@Path("/getAllShippingCompany")
public List<ShippingCompany> getAllShippingCompany() {
return entityManager.createQuery("SELECT DISTINCT c FROM ShippingCompany c JOIN FETCH c.coveredRegions", ShippingCompany.class).getResultList();
}
仍然没有工作
您收到的错误表明序列化 ShippingCompany 类的 coveredRegions 属性存在问题,这很可能是因为它是一个联合实体。
要解决此问题,您可以使用 JSON-B JsonbConfig 对象来配置 ShippingCompany 类的序列化,包括其连接的实体。以下是如何执行此操作的示例:
@GET
@Path("/getAllShippingCompany")
public Response getAllShippingCompany() {
List<ShippingCompany> companies = entityManager.createQuery("SELECT DISTINCT c FROM ShippingCompany c JOIN FETCH c.coveredRegions", ShippingCompany.class).getResultList();
JsonbConfig config = new JsonbConfig()
.withPropertyVisibilityStrategy(new RuntimeJsonbPropertyVisibilityStrategy(companies.get(0).getClass()));
Jsonb jsonb = JsonbBuilder.create(config);
String json = jsonb.toJson(companies);
return Response.ok(json).build();
}
在上面的示例中,我们正在创建一个 JsonbConfig 对象并配置其 withPropertyVisibilityStrategy() 方法以将 RuntimeJsonbPropertyVisibilityStrategy 与列表中第一个 ShippingCompany 对象的类一起使用。这确保所有属性(包括连接的实体)都正确序列化。
然后我们使用配置的 JsonbConfig 创建一个 Jsonb 对象,并使用它将公司列表序列化为 JSON 格式。最后,我们返回一个 Response 对象,将序列化后的 JSON 作为响应体。
这应该可以解决序列化错误并允许您检索所有 ShippingCompany 对象,包括它们连接的 coveredRegions。