当前位置: 首页 > 知识库问答 >
问题:

Spring HATEOS-如何投射基类型类的所有属性?

衡安晏
2023-03-14

给定给定类的投影,有没有办法告诉Spring包含在投影注释类型中定义的类的所有默认属性?

给定2实体类

@Entity 
@Data 
public class Client {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    private String nom;
    private String adresseLigne1;
    private String adresseLigne2;
    private String ville;

    @ManyToOne
    private Province province; 
    /* Many other attribute */

}

@Entity
@Data
public class Province {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String name;
}

每个都有一个储存库

@RepositoryRestResource(collectionResourceRel = "Client", path = "Client")
public interface ClientRepository extends PagingAndSortingRepository<Client, Long> {
    List<Client> findBy();
}

-

@RepositoryRestResource(collectionResourceRel = "Province", path = "Province")
public interface ProvinceRepository extends PagingAndSortingRepository<Province, Long> {
    List<Province> findByName(String name);
}

我为客户端获得以下默认json:

{
  "nom" : "Mallowpond High",
  "adresseLigne1" : "895 Gonçal Burg",
  "adresseLigne2" : "Apt. 450",
  "ville" : "Lake Irenehaven",
  "_links" : {
    "self" : {
      "href" : "http://127.0.0.1:8080/api/rest/Client/108"
    },
    "province" : {
      "href" : "http://127.0.0.1:8080/api/rest/Client/108/province"
    }
  }
}

有没有一种方法可以创建一个投影,该投影将返回客户机的所有属性,而不必为客户机中的所有属性编写所有getXXX方法

@Projection(name = "inlineProvince", types = { Client.class })
public interface ClientProjection {
    /* A way to tell the projection to include all of Client attribute */
    Province getProvince();  // This is the linked object I want to add to my json output as an in-line map (i.e have the behaviour as if it did not have it's own Repository)
}

这样我可以在调用时在客户端JSON中嵌入省http://127.0.0.1:8080/api/rest/Client/108?projection=inline:

{
  "nom" : "Mallowpond High",
  "adresseLigne1" : "895 Gonçal Burg",
  "adresseLigne2" : "Apt. 450",
  "ville" : "Lake Irenehaven",
  "_links" : {
    "self" : {
      "href" : "http://127.0.0.1:8080/api/rest/Client/108"
    },
    "province" : {
      "href" : "http://127.0.0.1:8080/api/rest/Client/108/province"
    }
  },
  "province" : {
    "name" : "Quebec"
  }
}

我发现我能做到:

@Projection(name = "inline", types = { Client.class })
public interface ClientProjection {
    @Value("#{target}") 
    Client getClient();
    Province getProvince();  // This is the linked object I want to add to my json output as an in-line map (i.e have the behaviour as if it did not have it's own Repository)
}

但我两个都有客户

{
  "province" : {
    "name" : "quebec"
  },
  "client" : {
      "nom" : "Mallowpond High",
      "adresseLigne1" : "895 Gonçal Burg",
      "adresseLigne2" : "Apt. 450",
      "ville" : "Lake Irenehaven",
      "_links" : {
        "self" : {
          "href" : "http://127.0.0.1:8080/api/rest/Client/108"
        },
        "province" : {
          "href" : "http://127.0.0.1:8080/api/rest/Client/108/province"
        }
      }
  }
}

共有1个答案

芮瑾瑜
2023-03-14

你的@RestRepositoryResources所产生的内容叫做HAL格式。你所要求的内容偏离了HAL的规范,我建议继续使用标准(原因很明显)。

HAL支持将关系嵌入到资源中。这意味着您将得到一个嵌入的字段,该字段将保存一个包含省的基数1集合。看起来是这样的:

{
  "nom" : "Mallowpond High",
  "adresseLigne1" : "895 Gonçal Burg",
  "adresseLigne2" : "Apt. 450",
  "ville" : "Lake Irenehaven",
  "_links" : {
    "self" : {
      "href" : "http://127.0.0.1:8080/api/rest/Client/108"
    },
    "province" : {
      "href" : "http://127.0.0.1:8080/api/rest/Client/108/province"
    }
  },
  "_embedded"{
     "provinces" : [{
        "name" : "Quebec",
        "_links" : {
          "self" : {
            "href" : "http://127.0.0.1:8080/api/rest/Client/108/province"
          }
        }
     }]
  }
}

不幸的是,Spring的@RepositoryRestResource不容易支持这一点,但仍然相对容易实现。您需要添加一个ResourceAssembler,并将客户端转换为支持_embedded字段的ClientResource。看看这个问题,你如何做到这一点(我自己也用这个)

 类似资料:
  • 我的代码中有以下对象。 如何最好地删除所有“地址”字段?因此,我得出以下结果。我一直在努力寻找这个基本问题的答案。

  • 您好,我正在建立一个动物园微服务,包括动物、员工、客户和价格表。我的动物微服务可以工作,但在我的员工微服务中,我遇到了一个错误,即没有为类型“EmployeeModel”找到属性“name”。在问这个问题之前,我已经在网上搜索了几个小时,还有一些类似的问题。我在模型中没有“名字”employee_name,我只是感到困惑,不知道如何修复它。任何指导/建议/信息将不胜感激:)第一次发布,所以我希望我

  • 问题内容: 我正在将我的某些类从对getter和setter的广泛使用改为对属性的更pythonic的使用。 但是现在我陷入了困境,因为以前的一些getter或setter方法会调用基类的相应方法,然后执行其他操作。但是如何通过属性来实现呢?如何在父类中调用属性getter或setter? 当然,仅调用属性本身即可进行无限递归。 问题答案: 您可能认为您可以调用由属性调用的基类函数: 尽管我认为这

  • 如何使类示例推断类型基于实例值检查: 打字沙盒。

  • 问题内容: 我有下表: 我需要将其映射到对象: 在哪里,StronglyTypedData类似于: 默认情况下,XML列映射到XmlDocument属性,但是我希望XML序列化/反序列化到StronglyTypedData属性发生在映射时。 我需要怎么做才能做到这一点? 问题答案: 您需要编写一个负责转换的。 您可以从XmlDocType开始,它实际上是从原始XML转换为XmlDocument的那