gpt4 book ai didi

java - Spring Data REST 如何内联添加嵌入式资源

转载 作者:IT老高 更新时间:2023-10-28 13:49:04 25 4
gpt4 key购买 nike

我将 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

在我的示例中,我介绍了我遇到的两个困难:列表(公司)和多个级别:人员->公司->地址。两者都需要工作(可能有 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"
}
}
}

或者,如果您不需要将 CompanyAddress 实体公开为剩余资源,则可以使用 @RepositoryRestResource(exported= false),它们将在任何被引用的地方内联,不需要任何投影。

最后一个警告 - 这个请求在某种程度上与 Spring Data REST 和 Spring HATEOAS 的精神作斗争,并引发了遭受 n+1 问题的大而笨重的查询。请记住,Spring Data REST 不是将域模型转换为 API 的统包解决方案,并且呈现深层对象图(如果这是您的意图)可能是您可能会在临时基础上公开为自定义 Controller 端点的东西可以彻底控制条件。

关于java - Spring Data REST 如何内联添加嵌入式资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38096217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com