首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring引导rest服务,如何使其将链接编组为属性?

Spring引导rest服务,如何使其将链接编组为属性?
EN

Stack Overflow用户
提问于 2015-04-26 02:58:13
回答 2查看 1.5K关注 0票数 6

第一个问题,所以请温和一点:)

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

我的实体:

代码语言:javascript
复制
@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。

代码语言:javascript
复制
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中,但是不管它在不在那里,这似乎都没有什么区别。

代码语言:javascript
复制
@Bean
@Primary
public ObjectMapper objectMapper() {
    ObjectMapper o = new ObjectMapper();
    o.registerModule(new Jackson2HalModule());
    return o;
}

提前感谢您的帮助!

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

解决方案:

第一步,阅读手册:)

因此,我发现我需要在新创建的DTO上扩展ResourceSupport。已经做好了。但我没有得到任何链接!我似乎需要将Jackson2HalModule添加到RestTemplate上的对象映射器中,如下所示:

代码语言:javascript
复制
    ObjectMapper o = new ObjectMapper();
    o.registerModule(new Jackson2HalModule());
    MappingJackson2HttpMessageConverter c = new MappingJackson2HttpMessageConverter();
    c.setObjectMapper(o);
    restTemplate.getMessageConverters().add(0, c);

因此,我想我将扩展RestTemplate和@Component,我应该对任何HATEOAS资源都有好处。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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请求。

票数 3
EN

Stack Overflow用户

发布于 2018-09-07 07:50:04

您需要扩展RepositoryRestConfigurerAdapter来告诉您需要导出Id,例如:

代码语言:javascript
复制
public class RepositoryConfig extends RepositoryRestConfigurerAdapter {
    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.exposeIdsFor(SignUpSheet.class);
 }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29873194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档