【问题标题】:How to return JSON without wrapper from Spring ResponseEntity?如何从 Spring ResponseEntity 返回没有包装器的 JSON?
【发布时间】:2020-03-01 05:48:06
【问题描述】:

控制器返回 ResponseEntity

@GetMapping("/users/{id}")
public ResponseEntity<UserResource> getUserById{}

用户资源是从 RestResource 扩展而来的

public class UserResource extends ResourceSupport {}

当我调用其余 API 时,我得到了

 {
      "user": {
        "id": 49,
        "firstName": "Admin"
      },
      "links": [
        {...}]
    }

如何在没有顶层包装的情况下获得它?像这样?

{
  "id": 49,
  "firstName": "Admin"
}

这很有趣,因为当我使用 Spring Data Rest 时,返回的数据实际上是后一种,但 SDR 也使用 Spring-HATEOAS。

【问题讨论】:

    标签: spring-boot spring-data spring-data-rest spring-hateoas hal-json


    【解决方案1】:

    您无需创建ResponseEntity。只需返回对象:

    @ResponseBody
    @GetMapping("/users/{id}")
    public UserResource getUserById() {
       // your method
       return new UserResource();
    }
    

    如果你想使用 HATEOAS,恐怕没有办法将你的有效载荷放在根目录中(不包​​装)。但是你也可以返回没有ResponseEntity的对象:https://www.baeldung.com/spring-hateoas-tutorial

    【讨论】:

    • 问题是我需要添加符合 HATEOAS 的链接,所以我需要一个扩展 ResourceSupport 的 DTO。你知道 SpringDataRest 是怎么做的吗?
    • 您能否提供一个预期输出的示例(包括链接)?
    【解决方案2】:

    原来...关键是不要返回您自己的扩展 ResourceSupport 的 Resource 对象。

    而只是返回 org.springframework.hateoas.Resource ,由于某种原因将被序列化为平面结构,而不是包装。

    【讨论】:

      【解决方案3】:

      您也可以使用自己的 Resource 对象来扩展 ResourceSupport。

      诀窍是您需要在 content 属性上使用 JACKSON 注释:

      @JsonUnwrapped
      public T getContent() {
          return content;
      }
      

      【讨论】:

        猜你喜欢
        • 2020-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-13
        • 1970-01-01
        • 2018-01-11
        • 2013-12-18
        • 2022-08-23
        相关资源
        最近更新 更多