【问题标题】:How to consume a Spring HAL/HATEOAS API in Java using purely Jackson, not Spring如何使用纯 Jackson 而不是 Spring 在 Java 中使用 Spring HAL/HATEOAS API
【发布时间】:2020-11-17 18:10:34
【问题描述】:

我们正在尝试为使用 Spring Data 创建的 API 创建 Java 客户端。

一些端点返回包含 _embedded 和 _links 属性的 hal+json 响应。

我们目前的主要问题是试图将我们的头脑围绕以下结构:

{
    "_embedded": {
        "plans": [
            {
               ...
            }
        ]
    },
   ...
}

当您点击计划端点时,您会得到一个分页响应,其内容在 _embedded 对象中。因此,逻辑是您调用计划并返回包含 _embedded 对象的响应,该对象包含包含计划对象数组的计划属性。

_embedded 对象的内容也可以变化,尝试使用泛型的解决方案(如下例所示)最终返回给我们一个 LinkedHashMap 对象列表,而不是预期的类型。

class PaginatedResponse<T> {
    @JsonProperty("_embedded")
    Embedded<T> embedded;

    ....
}

class Embedded<T> {
    @JsonAlias({"plans", "projects"})
    List<T> content; // This instead of type T ends up deserialising as a List of LinkedHashMap objects

    ....
}

我不确定上述问题是否与此Jackson bug report dating from 2015 有关。

到目前为止,我们唯一的解决方案是为每种类型的内容创建分页响应,具有明确定义的类型,或者为我们期望接收的每种类型的对象包含一个 List 并确保我们只从填充列表中读取,而不是从空列表中读取。

所以我们对这个相当广泛的问题的主要问题是,应该如何在不使用 Spring 的情况下导航这样的 API?

我们不认为以任何形式使用 Spring 作为可接受的解决方案。同时,我在这里可能错了,但看起来在 java 世界中,Spring 是唯一积极支持/促进 HAL/HATEOAS 的框架?

很抱歉,如果在这个问题中存在错误表达的概念、假设和术语,但我们正试图围绕这种实现的理念以及如何从 Java 的角度处理它。

【问题讨论】:

    标签: java jackson spring-hateoas hateoas


    【解决方案1】:

    您可以尝试使用超类型令牌来使用 HATEOS API。一种处理各种仇恨响应的通用方式。

    例如

    处理响应的通用类下面

    public class Resource<T>  {
     
     protected Resource() {
      this.content = null;
     }
     
     public Resource(T content, Link... links) {
      this(content, Arrays.asList(links));
     }
    }
    

    下面的代码读取各种对象的响应

    ObjectMapper objectMapper = new ObjectMapper();
    Resource<ObjectA> objectA = objectMapper.readValue(response, new TypeReference<Resource<ObjectA>>() {});
    
    Resource<ObjectB> objectB = objectMapper.readValue(response, new TypeReference<Resource<ObjectB>>() {});
    

    你可以参考下面

    http://www.java-allandsundry.com/2012/12/json-deserialization-with-jackson-and.html

    http://www.java-allandsundry.com/2014/01/consuming-spring-hateoas-rest-service.html

    【讨论】:

    • 你好@karthick-manickam,根据这个“......在Spring-hateoas项目中名为Resource的java类型......”您提出的解决方案是使用Spring框架的一部分。那是对的吗?如果是这样,我们就不能使用它,因为我们不想对 Spring 有任何依赖。
    猜你喜欢
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    相关资源
    最近更新 更多