使用 spring-hateoas 反序列化包含(_links 和 _embedded)的 JSON

2023-12-19

我正在尝试调用非常简单的 json Web 服务,返回这种形式的数据:

{
    "_embedded": {
        "users": [{
            "identifier": "1",
            "firstName": "John",
            "lastName": "Doe",
            "_links": {
                "self": {
                    "href": "http://localhost:8080/test/users/1"
                }
            }
        },
        {
            "identifier": "2",
            "firstName": "Paul",
            "lastName": "Smith",
            "_links": {
                "self": {
                    "href": "http://localhost:8080/test/users/2"
                }
            }
        }]
    },
    "_links": {
     "self": {
       "href": "http://localhost:8080/test/users"
     }
   },
   "page": {
     "size": 20,
     "totalElements": 2,
     "totalPages": 1,
     "number": 0
   }
}

正如您所看到的,它非常简单。 我在解析链接时没有任何问题,我的 POJO 扩展为 ResourceSupport。 它们是这样的:

UsersJson(根元素)

public class UsersJson extends ResourceSupport {
    private List<UserJson> users;

    [... getters and setters ...]
}

UserJson

public class UserJson extends ResourceSupport {

    private Long identifier;

    private String firstName;

    private String lastName;

    [... getters and setters ...]
}

问题是,我期望 jackson 和 spring 足够聪明,能够解析 _embedded 属性并填充我的 UsersJson.users 属性,但事实并非如此。

我尝试了在互联网上找到的各种东西,但我唯一能正常工作的是创建一个新类作为 _embedded 包装器:

UsersJson(根元素)

public class UsersJson extends ResourceSupport {
    @JsonProperty("_embedded")
    private UsersEmbeddedListJson  embedded;

    [... getters and setters ...]
}

嵌入式“包装器”

public class UsersEmbeddedListJson extends ResourceSupport {
    private List<UserJson> users;

    [... getters and setters ...]
}

它有效,但我觉得它很丑。

然而,我虽然 RestTemplate 的以下配置会起作用(特别是当我在 Jackson2HalModule 中看到 EmbeddedMapper 时),但它没有:

        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.registerModule(new Jackson2HalModule());

        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setSupportedMediaTypes(MediaType.parseMediaTypes("application/hal+json"));
        converter.setObjectMapper(mapper);

        RestTemplate restTemplate = new RestTemplate(Collections.singletonList(converter));

        ResponseEntity<UsersJson> result = restTemplate.getForEntity("http://localhost:8089/test/users", UsersJson.class, new HashMap<String, Object>());
        System.out.println(result);

有人可以告诉我我错过了什么吗?


最后,我找到了一种更好的方法来使用这些 application/hal+json API。

Spring hatoas 实际上提供了一个几乎可以使用的客户端:org.springframework.hateoas.client.Traverson。

Traverson traverson = new Traverson(new URI("http://localhost:8080/test"), MediaTypes.HAL_JSON);
TraversalBuilder tb = traverson.follow("users");
ParameterizedTypeReference<Resources<UserJson>> typeRefDevices = new ParameterizedTypeReference<Resources<UserJson>>() {};
Resources<UserJson> resUsers = tb.toObject(typeRefDevices);
Collection<UserJson> users= resUsers .getContent();

如您所见,我删除了 UsersJson 和 UsersEmbeddedListJson。

这是我添加的maven依赖项

    <dependency>
        <groupId>org.springframework.hateoas</groupId>
        <artifactId>spring-hateoas</artifactId>
        <version>0.19.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.plugin</groupId>
        <artifactId>spring-plugin-core</artifactId>
        <version>1.2.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.jayway.jsonpath</groupId>
        <artifactId>json-path</artifactId>
        <version>2.0.0</version>
    </dependency>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 spring-hateoas 反序列化包含(_links 和 _embedded)的 JSON 的相关文章

  • 删除优先级队列的尾部元素

    如何删除优先级队列的尾部元素 我正在尝试使用优先级队列实现波束搜索 一旦优先级队列已满 我想删除最后一个元素 优先级最低的元素 Thanks 没有简单的方法 将元素从原始元素复制到新元素 最后一个除外 PriorityQueue remov
  • 从 MS Access 中提取 OLE 对象(Word 文档)

    我有一个 Microsoft Access 数据库 其中包含一个包含 Microsoft Word 文档的 OLE 对象字段 我试图找到代码来检索保存在 OLE 对象中的文件 以便用户可以从我的 JavaFx 应用程序中的按钮下载它 但没有
  • 为什么 MOVE CURSOR 在 OS X Mountain Lion 上不显示?

    我正在做一个项目 想看看 Swing 提供的每个光标是什么样子的 public class Test public static void main String args JFrame frame new JFrame frame set
  • Spring数据中的本机查询连接

    我有课 Entity public class User Id Long id String name ManyToMany List
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • Spring Batch:一个读取器、多个处理器和写入器

    在 Spring 批处理中 我需要将 ItemReader 读取的项目传递给两个不同的处理器和编写器 我想要实现的是 gt ItemProcessor 1 gt ItemWriter 1 ItemReader gt item gt Item
  • 通过 appassembler-maven-plugin 生成的脚本无法在 Spring Boot 应用程序中找到主类

    我使用 appassembler maven plugin 生成的启动脚本有问题 我有一个基本的 spring boot 应用程序 只有一个类 SpringBootApplication public class ScriptDemoApp
  • Java、Spring:使用 Mockito 测试 DAO 的 DataAccessException

    我正在尝试增加测试覆盖率 所以我想知道 您将如何测试 DAO 中抛出的 DataAccessExceptions 例如在一个简单的 findAll 方法中 该方法仅返回数据源中的所有数据 就我而言 我使用 Spring JdbcTempla
  • 我们如何测试包私有类?

    我正在看书Effective Java in Item 13 Minimize the accessibility of classes and members 它提到 为了方便测试 您可能想让类 接口或成员更易于访问 这在某种程度上是好的
  • 如何停止执行的 Jar 文件

    这感觉像是一个愚蠢的问题 但我似乎无法弄清楚 当我在 Windows 上运行 jar 文件时 它不会出现在任务管理器进程中 我怎样才能终止它 我已经尝试过 TASKKILL 但它对我也不起作用 On Linux ps ef grep jav
  • 无法在 Java/Apache HttpClient 中处理带有垂直/管道栏的 url

    例如 如果我想处理这个网址 post new HttpPost http testurl com lists lprocess action LoadList 401814 1 Java Apache 不允许我这么做 因为它说竖线 是非法的
  • Java - 从 XML 文件读取注释

    我必须从 XML 文件中提取注释 我找不到使用 JDOM 或其他东西来让它们使用的方法 目前我使用 Regex 和 FileReader 但我不认为这是正确的方法 您可以使用 JDOM 之类的东西从 XML 文件中获取注释吗 或者它仅限于元
  • Karaf / Maven - 无法解决:缺少需求 osgi.wiring.package

    我无法在 Karaf 版本 3 0 1 中启动捆绑包 该包是使用 Maven 构建的并导入gson http mvnrepository com artifact com google code gson gson 2 3 1 我按照要求将
  • 集成 Spring Webflow 2 和 Apache Tiles [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我最近开始升级一些应用程序以使用 Spring Webflow 2 并且我想利用 Webflow 2
  • 源值 1.5 的错误已过时,将在未来版本中删除

    我使用 scala maven plugin 来编译包含 scala 和 java 代码的项目 我已经将源和目标设置为1 7 但不知道为什么maven仍然使用1 5 这是我在 pom xml 中的插件
  • 如何(安全)将 Python 对象发送到我的 Flask API?

    我目前正在尝试构建一个 Flask Web API 它能够在 POST 请求中接收 python 对象 我使用 Python 3 7 1 创建请求 使用 Python 2 7 运行 API 该 API 设置为在我的本地计算机上运行 我试图发

随机推荐

  • 为了清晰起见,重构嵌套 IF 语句[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我想重构这个繁琐的方法以使其更具可读性 它有太多我喜欢的嵌套 IF 你会如何重构这个 public static void HandleUplo
  • CQRS - 是否允许从写入端调用读取端?

    我开始阅读有关 CQRS 的内容 但我有点困惑 是否允许在写入端调用读取端来获取附加信息 http cqrs nu Faq command handlers http cqrs nu Faq command handlers在这里他们说这是
  • 将 Postgres \i 输入的输出放入文件?

    快速问题 我希望 如果我使用 i 将输入文件输入 psql 我可以将查询的输出保存到文件中吗 如果是这样 怎么办 谢谢 Using o正如其他人所推荐的 是一个很好的解决方案 不过 只是为了好玩 另一种方法是将输入文件通过管道传输到psql
  • Facebook Messenger 客户聊天插件在未登录时不显示

    我已在我们的网站之一上集成了 Facebook 客户插件 我按照开发人员文档中的说明进行操作 当有活跃的 Facebook 会话时 它工作正常 但是 当没有活动的 Facebook 会话时 该插件根本不会出现 我可能错过了一些东西 但我不知
  • React Native listview:当行到达底部时如何将行粘在屏幕底部

    Using stickyHeaderIndices Ref 粘性标题索引 https facebook github io react native docs listview html stickyheaderindices 在 Reac
  • 将文件设置保存在 ini 而不是注册表中

    我是 MFC 新手 在 myApp InitInstance 中创建第一个应用程序后 我有 SetRegistryKey T Local AppWizard Generated Applications 我可以删除它并将设置保存到我自己的
  • 如何在 html/css 中将图像旁边的文本垂直居中?

    在 html 中将图像旁边的文本垂直居中的最佳和最简单的方法是什么 需要与浏览器版本 类型无关 纯 html CSS 解决方案 这可能会让你开始 http phrogz net CSS vertical align index html 我
  • C++ 中有“byte”数据类型吗?

    如果存在 是否需要包含头文件 此代码会导致编译错误 int main byte b 2 error 不 没有所谓的类型 byte 在 C 中 你想要的是unsigned char 或者 如果您正好需要 8 位 uint8 t from
  • 从 Fortran 中读取 C++“Hello World”

    我正在尝试验证一个用 c 编写的简单的 hello world 函数可以从 FORTRAN 脚本 gfortran 4 9 20 调用 我对 c 和 FORTRAN 都没什么经验 所以我认为这是我应该开始的 code cpp include
  • 使用 ImageView 快速连续显示多张图像

    我有一个应用程序 在一个窗口中 有一个 NSImageView 用户应该能够将任何文件 文件夹 不仅仅是图像 拖放到图像视图中 因此我对 NSImageView 类进行了子类化以添加对这些类型的支持 我选择 NSImageView 而不是普
  • 如何使用 Unix join 获取外连接中的所有字段?

    假设我有两个文件 en csv and sp csv 每个包含恰好两个逗号分隔的记录 en csv 1 dog red car 3 cat white boat sp csv 2 conejo gris tren 3 gato blanco
  • 如何将一个文档中的数组值映射到另一个文档并显示在结果中

    我是 Couchbase 的新手 已经尝试了几个小时了 已查看文档但无法找到这个特定场景 我的存储桶中有文档 type order order id 1 products product id 1 qty 10 product id 2 q
  • 返回具有最大子文档的文档

    我试图根据日期值返回一个包含最大子文档的文档 到目前为止 我能够创建正确的对象 但是查询返回所有子文档而不是具有最大日期的子文档 例如 我的数据存储为 value 1 id 5cb9ea0c75c61525e0176f96 name Tes
  • 如何在django中故意返回404页面

    我在 django 中制作了自定义 404 页面 我正在尝试故意获取 404 错误页面 myproject urls py from website views import customhandler404 customhandler50
  • HttpClient 4 - 如何捕获最后的重定向 URL

    我有相当简单的 HttpClient 4 代码 它调用 HttpGet 来获取 HTML 输出 HTML 返回 脚本和图像位置均设置为本地 例如 img src images foo jpg 所以我需要调用 URL 将它们变成绝对 img
  • 如何更改清理作业的 cdc 保留值?

    我正在 asp net mvc2 应用程序上实现日志记录功能 该应用程序使用 SqlServer2008 作为数据库 使用实体框架作为数据模型 我启用了 Sql Server 的 CDC 功能 其日志记录更改得很好 但我刚刚注意到一些旧的日
  • 在 OSX Mavericks 上的 R 中安装 rjags

    我正在尝试在 R 中安装包 rjags 但遇到以下错误 Loading required package rjags Error onLoad failed in loadNamespace for rjags details call d
  • Square 随机数代表什么?

    我正在尝试向 Square 提交付款 但不确定该付款是什么card nonce代表 完整的 API 文档在这里 https docs connect squareup com api connect v2 endpoint createcu
  • 反转 DataFrame 列顺序

    我想简单地反转给定 DataFrame 的列顺序 我的数据框 data year 2010 2011 2012 2011 2012 2010 2011 2012 team Bears Bears Bears Packers Packers
  • 使用 spring-hateoas 反序列化包含(_links 和 _embedded)的 JSON

    我正在尝试调用非常简单的 json Web 服务 返回这种形式的数据 embedded users identifier 1 firstName John lastName Doe links self href http localhos