这是我第一次提问,请温柔点 :)
我有一个 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
}
一切都很好,我已经在我的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"
}
}
}
太好了!基本符合我的期望。现在我使用Spring的RestTemplate来调用我的服务,但是我遇到了问题。当它反序列化回SignUpSheet对象时,它会拉取大部分对象,但ID字段为空(这很合理,因为Json中没有ID字段,只有自引用),而所有的OneToMany和ManyToOne对象也为空(我认为原因相同)。
我的问题是:如何告诉Spring Hateoas将ID添加到json中,或者告诉Jackson将ID序列化到ID字段中?此外,如何获取链接?我不应该反序列化回JPA实体,而是创建另一个POJO来表示SignUpSheet(出于重复目的,我希望避免这样做,但如果有必要/有益的话,我可以考虑)。我已经将Jackson2HalModule添加到了ObjectMapper中,但无论是否存在都似乎没有任何区别。
@Bean
@Primary
public ObjectMapper objectMapper() {
ObjectMapper o = new ObjectMapper();
o.registerModule(new Jackson2HalModule());
return o;
}
感谢您的帮助!
=======================================================
解决方案:
第一步,先阅读手册 :)
我发现我需要在新创建的DTO上扩展ResourceSupport。已经完成了。但是没有返回链接!似乎我需要在RestTemplate上的对象映射器上添加Jackson2HalModule,就像这样:
ObjectMapper o = new ObjectMapper();
o.registerModule(new Jackson2HalModule());
MappingJackson2HttpMessageConverter c = new MappingJackson2HttpMessageConverter();
c.setObjectMapper(o);
restTemplate.getMessageConverters().add(0, c);
所以我想我会扩展RestTemplate并使用@Component,这样我就可以处理任何HATEOAS资源了。
Link
类或者创建自己的类。 - Andy Wilkinson