如何仅使用Jackson而不是Spring来使用Java使用Spring HAL / HATEOAS API

时间:2020-07-28 10:14:42

标签: java jackson spring-hateoas hateoas

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

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

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

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

点击计划端点时,您将获得分页响应,其内容位于_embedded对象中。因此,逻辑是调用计划,然后返回一个响应,该响应包含一个_embedded对象,该对象包含一个plans属性,该属性包含计划对象的数组。

_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的角度来对待。 >

1 个答案:

答案 0 :(得分:0)

您可以尝试使用超类型令牌使用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