我们正在尝试为使用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的角度来对待。 >
答案 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