当前位置: 首页 > 知识库问答 >
问题:

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

钱照
2023-03-14

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

有些endpoint返回包含_embedded和_links属性的HAL+JSON响应。

{
    "_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年的Jackson bug报告相关。

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

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

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

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

共有1个答案

蓬宾白
2023-03-14

您可以尝试使用超级类型令牌来消费HATEOS 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/2014/01/consument-spring-hateoas-rest-service.html

 类似资料:
  • 我有Spring Boot Hadoop,想要利用Spring HbasTemboard。我的问题是留档只有关于配置和设置的“xml”方式的信息。 与官方文档中显示的xml不同,我如何以及在何处将配置定义为java中的hbase配置? http://docs.spring.io/spring-hadoop/docs/1.0.1.RC1/reference/html/hbase.html

  • 在我的spring boot应用程序中,我使用jackson通过在需要的地方注入来序列化对象。我找到了这样的答案:https://stackoverflow.com/a/32842962/447426,但这一个创建了一个新的映射器--使用jacksons的默认设置。 另一方面,我在官方文件中发现了这一点。我不是很明白。没有示例代码。 那么如何在spring默认对象映射器的基础上配置springs

  • 我正在用Spring(无Spring Boot)构建一个Java客户端,并且必须使用Gson。 我如何告诉Spring使用Gson而不是Jackson? 为了澄清,我使用了反应式WebClient: Pojo应该是这样的: 服务器中的Json是这样的:

  • Spring Boot 1.4.2参考声明: Springhttp。转换器。首选json映射器=jackson#用于HTTP消息转换的首选json映射器。设置为“gson”以强制使用gson 我们做到了。 我们为首选json映射器设置了gson 但杰克逊还是被利用了。 最后,在排除了Maven中所有向Jackson指出的可传递依赖项之后,我们设法强制Spring Boot使用Gson。 现在的问题

  • 我试图使用Gson发送JsonObjects作为响应。这些JsonObjects是手工构造的,而不是使用objectMapper或GSON。我排除了所有与杰克逊有关的依赖关系。它工作得很好很好。后来,我尝试使用SpringFox添加Swagger文档。现在它抛出以下异常:

  • 我花了过去的一天,试图找到一个解决办法,但没有找到任何在线资源,解决了这个问题。 我使用Gson为我的应用程序进行消息转换,它在单元测试之外工作得很好。我甚至添加了bean以优先于Jackson而不是将配置值写入。这只在运行应用程序时起作用。 现在我的问题是,如何使用的Gson序列化/反序列化?我有一个带有批注的类,它的值与实际名称不同。我最接近找到答案的是下面的一个,但没有任何帮助: https