Dou*_*ley 6 spring-data-jpa spring-data-rest spring-hateoas spring-boot
这里的第一个问题所以要温柔:)
我有一个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
}
Run Code Online (Sandbox Code Playgroud)
一切都很好,我打电话给我的pom添加了spring-boot-starter-data-rest,现在我得到了一个服务.这是我回来的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"
}
}
}
Run Code Online (Sandbox Code Playgroud)
超!几乎是我所期待的.现在我使用Spring的RestTemplate调用我的服务,这就是我被困的地方.当它返回到SignUpSheet对象时,它会拉入大部分对象,但ID字段为null(这是有道理的,因为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;
}
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助!
================================================== =====
解:
第一步,阅读手册:)
所以我发现我需要在新创建的DTO上扩展ResourceSupport.做完了.但我没有回复链接!好像我需要将Jackson2HalModule添加到RestTemplate上的对象映射器,如下所示:
ObjectMapper o = new ObjectMapper();
o.registerModule(new Jackson2HalModule());
MappingJackson2HttpMessageConverter c = new MappingJackson2HttpMessageConverter();
c.setObjectMapper(o);
restTemplate.getMessageConverters().add(0, c);
Run Code Online (Sandbox Code Playgroud)
所以我想我会延伸RestTemplate和@Component,我应该对任何HATEOAS资源都有好处.
我认为您不应该尝试将 JSON 反序列化回 JPA 实体。JPA 实体与应用程序的数据库紧密相关,应将其视为服务器的实现细节。相反,我建议映射到专门基于 REST API 建模的类型,而不是基于数据库结构和 JPA 使用情况建模的类型。
您正在使用 Spring Data REST,它强烈支持超媒体。这意味着客户端应该使用 URI 来标识资源和链接以在资源之间进行导航。例如,在客户端,一张注册表单已经有一个ID;这是响应中链接href的。self因此,无需公开 JPA 实体的 ID。事实上,这样做会暴露客户不需要知道的应用程序的实现细节。
Spring Data REST 并没有尝试填充响应中的所有属性,而是提供了链接。例如,要访问注册表单的父项,您应该从响应中提取链接并对 URI 执行href请求。parentGET
| 归档时间: |
|
| 查看次数: |
1244 次 |
| 最近记录: |