ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – Spring Data REST如何在线添加嵌入式资源

2019-10-04 17:10:39  阅读:224  来源: 互联网

标签:hateoas java spring rest spring-data-rest


我正在将Spring Data REST和Hateoas与HAL浏览器结合使用.这很好用,但现在我想用一组特定的实体和一组相关的对象进行JSON转储.我使用@Projection然后再次卡住了.

仅供参考:正常行为(包含嵌入式和链接等)应保留在新端点之外(没有嵌入式和链接).

为了进一步说明我的问题/问题:

class Person {
  String name;
  List<Company> companies;
}

class Company {
  String name;
  Address address;
}

class Address {
  String street;
}

现在我想看到这样的事情:

{
   "name": "John",
   "companies": [
        {
            "name": "Stackoverflow",
            "address": {"street": "Highway blvd."}
        },
        {
            "name": "Oracle",
            "address": {"street": "Main rd."}
        }
   ]
}

虽然我得到了这个:

{
   "name": "John",
   "_links": {
        "self": {"href": "http...."},
        "companies": {"href": "http ..."}
   },
}

另见:http://docs.spring.io/spring-data/rest/docs/current/reference/html/#projections-excerpts

在我的例子中,我介绍了我遇到的两个困难:列表(公司)和多个级别:person-> company->地址.两者都需要工作(可能有5个级别,其中一些级别有“很多”关系).

解决方法:

正如您所确定的那样,可接受的内联实体方法是预测.投影总是内联的,因此一个选项是为每个实体创建投影并将它们组合起来,如下所示:

@Projection(name = "personProjection", types = Person.class)
public interface PersonProjection {

    String getFirstName();
    List<CompanyProjection> getCompanies();

}

@Projection(name = "companyProjection", types = Company.class)
public interface CompanyProjection {

    String getName();
    AddressProjection getAddress();

}

@Projection(name = "addressProjection", types = Address.class)
public interface AddressProjection {

    String getStreet();

}

一个GET people / 1?projection = personProjection仍然会呈现_links元素,但是你会得到你想要的嵌套:

{
  "companies" : [ {
    "address" : {
      "street" : "123 Fake st",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/addresses/1{?projection}",
          "templated" : true
        }
      }
    },
    "name" : "ACME inc.",
    "_links" : {
      "self" : {
        "href" : "http://localhost:8080/companies/1{?projection}",
        "templated" : true
      },
      "address" : {
        "href" : "http://localhost:8080/companies/1/address"
      }
    }
  } ],
  "firstName" : "Will",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/people/1"
    },
    "person" : {
      "href" : "http://localhost:8080/people/1{?projection}",
      "templated" : true
    },
    "companies" : {
      "href" : "http://localhost:8080/people/1/companies"
    }
  }
}

或者,如果您不需要将公司和地址实体公开为其余资源,则可以使用@RepositoryRestResource(exported = false)标记其存储库,并且无论何处引用它们,它们都将被内联,而无需任何投影.

不过最后一点需要注意 – 这个请求在某种程度上与Spring Data REST和Spring HATEOAS的精神作斗争,并引发了大量的,笨拙的查询,遇到了n 1问题.请记住,Spring Data REST不是将域模型转换为API的交钥匙解决方案,并且渲染深层对象图(如果这是您的意图)可能是您可能在临时基础上作为自定义控制器端点公开的内容可以彻底控制条件.

标签:hateoas,java,spring,rest,spring-data-rest
来源: https://codeday.me/bug/20191004/1853728.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有