gpt4 book ai didi

spring-boot - Spring Boot Rest服务,如何让它将链接编码为属性?

转载 作者:行者123 更新时间:2023-12-04 15:33:26 25 4
gpt4 key购买 nike

这里的第一个问题所以要温柔:)

我有一个 JPA 项目,我想将其公开为 REST。到目前为止,我已经这样做了:

我的实体:

@Entity
public class SignUpSheet {
@Id
@GeneratedValue
private Long id;

@Column
private String name;

@Column
private String description;

@Column
@Temporal(TemporalType.TIMESTAMP)
private Date dateTime;

@ManyToOne
private User parent;

@OneToMany
private List<Volunteer> volunteers;

//getter and setters
}

一切顺利,我将 spring-boot-starter-data-rest 添加到我的 pom 中,现在我得到了一项服务。这是我返回的 JSON。
http://localhost:8080/api-0.1.0/signUpSheets/1

{
"name": "Auction",
"description": "My First Sign Up Sheet",
"dateTime": "2015-04-22T03:47:12.000+0000",
"volunteers": [
{
"role": "Bringing stuff",
"comments": "I have comments!"
}
],
"endpoint": "/signUpSheets",
"_links": {
"self": {
"href": "http://localhost:8080/api-0.1.0/signUpSheets/1"
},
"parent": {
"href": "http://localhost:8080/api-0.1.0/signUpSheets/1/parent"
},
"user": {
"href": "http://localhost:8080/api-0.1.0/signUpSheets/1/user"
}
}
}

极好的!和我的预期差不多。现在我使用 Spring 的 RestTemplate 调用我的服务,这就是我卡住的地方。当它编码(marshal)回 SignUpSheet 对象时,它会拉入大部分对象,但 ID 字段为空(这是有道理的,因为 Json 中没有 ID 字段,只有一个自引用)并且所有 OneToMany 和 ManyToOne 对象都是null(我假设出于同样的原因)。

我的问题是:如何告诉 Spring Hateoas 将 ID 添加到 json 或告诉 Jackson 如何将 ID 编码到 ID 字段中?此外,我如何获得链接?我是否应该不将编码回 JPA 实体,而是为 SignUpSheet 创建另一个 POJO(出于重复目的,我想避免这种情况,但如果由于某种原因我遗漏了必要/可取的情况,则可以进行讨论)。我已将 Jackson2HalModule 添加到我的 ObjectMapper 中,但这似乎与它是否存在无关。
@Bean
@Primary
public ObjectMapper objectMapper() {
ObjectMapper o = new ObjectMapper();
o.registerModule(new Jackson2HalModule());
return o;
}

在此先感谢您的帮助!

================================================== ======

解决方案:

第一步,阅读手册:)

所以我发现我需要在我新创建的 DTO 上扩展 ResourceSupport。大功告成。但我没有得到任何链接!似乎我需要将 Jackson2HalModule 添加到对象映射器 在 RestTemplate 像这样:
    ObjectMapper o = new ObjectMapper();
o.registerModule(new Jackson2HalModule());
MappingJackson2HttpMessageConverter c = new MappingJackson2HttpMessageConverter();
c.setObjectMapper(o);
restTemplate.getMessageConverters().add(0, c);

所以我想我会扩展 RestTemplate 和 @Component 它,我应该对任何 HATEOAS 资源都有好处。

最佳答案

我认为您不应该尝试将 JSON 反序列化回您的 JPA 实体。 JPA 实体与您的应用程序的数据库密切相关,应该被视为服务器的实现细节。相反,我建议映射到专门针对 REST API 建模的类型,而不是根据数据库的结构和 JPA 的使用情况。

您正在使用强烈支持超媒体的 Spring Data REST。这意味着客户端应该使用 URI 来标识资源和链接以在它们之间导航。例如,在客户端,一个注册表单已经有一个ID;这是 hrefself回复中的链接。因此,无需从 JPA 实体公开 ID。事实上,这样做会暴露客户不需要知道的应用程序的实现细节。

Spring Data REST 没有尝试填充响应中的所有属性,而是提供链接。例如,要访问注册表单的父级,您应该提取 hrefparent响应中的链接并执行 GET URI 上的请求。

关于spring-boot - Spring Boot Rest服务,如何让它将链接编码为属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29873194/

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