如何使用纯Jackson而不是Spring在Java中使用SpringHAL/HATEOAS API



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

一些端点返回包含_embeded和_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
....
}

我不确定上述问题是否与2015年的杰克逊漏洞报告有关。

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

因此,我们对这个分散的问题的主要问题是,在不使用Spring的情况下,如何导航这样一个API

我们不认为以任何形式使用Spring都是可以接受的解决方案。同时,我在这里可能大错特错,但在java世界中,Spring似乎是唯一一个积极支持/推广HAL/HATEOS的框架?

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

您可以尝试使用超类型令牌消费HAEOS API。一种处理所有类型的hateos响应的通用方法。

例如

低于通用类以处理响应

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

最新更新