gpt4 book ai didi

spring - 使用 Spring HATEOAS 的规范 _links

转载 作者:行者123 更新时间:2023-12-04 20:42:01 33 4
gpt4 key购买 nike

我们正在构建一个类似于 spring.io 指南“Accessing JPA Data with REST”的 RESTful Web 服务。要重现下面的示例输出,只需将 ManyToOne-Relation 添加到 Person 如下:

// ...

@Entity
public class Person {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

private String firstName;
private String lastName;

@ManyToOne
private Person father;

// getters and setters
}

添加一些示例数据后的 GET 请求会产生:
{
"firstName" : "Paul",
"lastName" : "Mustermann",
"_links" : {
"self" : {
"href" : "http://localhost:8080/people/1"
},
"father" : {
"href" : "http://localhost:8080/people/1/father"
}
}
}

但是,鉴于 Paul 的父亲存储的 ID 为 2,我们想要的结果将是其关系的规范 url:
// ...
"father" : {
"href" : "http://localhost:8080/people/2"
}
// ...

如果某些人的父亲为空,这当然会导致问题(好吧,这在这里没有多大意义......;)),但在这种情况下,我们根本不想在 JSON 中呈现链接。

我们已经尝试实现一个 ResourceProcessor 来实现这一点,但似乎在调用处理器时链接尚未填充。我们设法添加了指向所需规范 url 的附加链接,但未能修改后来添加的链接。

问题:是否有通用方法来为所有资源自定义链接生成?

澄清我们对规范 URL 的需求:我们使用 SproutCore Javascript 框架来访问 RESTful Web 服务。它使用数据源的“类 ORM”抽象,我们已经为它实现了 Spring 生成的 JSON 输出的通用处理程序。当查询所有人时,我们需要向其他人发送 n*(1+q) 个请求(而不是仅 n 个),将 n 个具有 q 关系的人同步到客户端数据源。这是因为默认的“非规范”链接绝对不包含有关正在设置的父亲或父亲 id 的信息。似乎这会导致大量不必要的请求,如果初始响应首先包含更多信息,则可以轻松避免这些请求。

另一种解决方案是将父亲的 id 添加到关系中,例如:
"father" : {
"href" : "http://localhost:8080/people/1/father",
"id" : 2
}

最佳答案

Spring Data Rest 团队在某处有一个讨论解释了为什么属性以这种方式呈现为链接。话虽如此,您仍然可以通过抑制 SDR 生成的链接并实现 ResourceProcessor 来实现您喜欢的目标。 .因此,您的 Person 类将如下所示。注意注释 @RestResource(exported = false)抑制链接

@Entity
public class Person {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

private String firstName;
private String lastName;

@ManyToOne
@RestResource(exported = false)
private Person father;

// getters and setters
}

你的 ResourceProcessor 类看起来像
public class EmployeeResourceProcessor implements
ResourceProcessor<Resource<Person>> {

@Autowired
private EntityLinks entityLinks;

@Override
public Resource<Person> process(Resource<Person> resource) {
Person person = resource.getContent();
if (person.getFather() != null) {
resource.add(entityLinks.linkForSingleResour(Person.class, person.getFather().getId())
.withRel("father"));
}
return resource;
}

}

上述解决方案仅适用于 father值与 Person 一起被急切地获取.否则你需要拥有属性(property) fatherId并使用它代替 father属性(property)。不要忘记使用 jackson @ignore...隐藏 fatherId作为响应 JSON。

备注 : 我自己没有测试过,但我猜它会起作用

关于spring - 使用 Spring HATEOAS 的规范 _links,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24570279/

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