第一个问题,所以请温和一点:)
我有一个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
}一切都很好,我把增加的弹簧启动器数据-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调用我的服务,这里是我陷入困境的地方。当它封送回SignUpSheet对象时,它会提取大部分对象,但是ID字段是空的(这很有道理,因为Json中没有ID字段,只是一个自引用),并且所有的OneToMany和ManyToOne对象都是空的(出于同样的原因)。
我的问题是:我如何告诉Spring向json添加ID,或者告诉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资源都有好处。
发布于 2015-04-26 12:00:52
我认为您不应该试图将JSON反序列化回JPA实体中。JPA实体与应用程序的数据库紧密相连,应该被视为服务器的实现细节。相反,我建议映射到特定基于REST的类型,而不是数据库的结构和JPA的使用。
您使用的是Spring数据REST,它非常支持超媒体。这意味着客户端应该使用URI来标识资源和在它们之间导航的链接。例如,在客户端,注册表已经有一个ID;它是响应中self链接的self。因此,不需要从JPA实体公开ID。实际上,这样做将暴露客户不需要知道的应用程序的实现细节。
Spring数据REST没有尝试填充响应中的所有属性,而是提供了链接。例如,要访问注册表的父表,应该从响应中提取parent链接的parent,并在URI上执行GET请求。
发布于 2018-09-07 07:50:04
您需要扩展RepositoryRestConfigurerAdapter来告诉您需要导出Id,例如:
public class RepositoryConfig extends RepositoryRestConfigurerAdapter {
@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
config.exposeIdsFor(SignUpSheet.class);
}
}https://stackoverflow.com/questions/29873194
复制相似问题