我如何在使用 2 个表之间的连接时获取 Alll

问题描述 投票:0回答:1

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();
    }

仍然没有工作

http jpa ejb
1个回答
0
投票

您收到的错误表明序列化 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。

© www.soinside.com 2019 - 2024. All rights reserved.