使用Spring RestTemplate和Super类型令牌消费Spring-hateoas Rest服务

Spring-hateoas为应用程序创建遵循HATEOAS原理的基于REST的服务提供了一种极好的方法。

我的目的不是要展示如何创建服务本身,而是要展示如何将客户端写入服务。

我将要使用的示例服务是Josh Long( @starbuxman )编写的“ the-spring-rest-stack ”。 我要使用的特定子项目是这里的阴影。 如果使用“ mvn jetty”命令运行此子项目,则可以在http:// localhost:8080 / users / 2中使用基于REST的端点列出用户的详细信息,其中“ 2”是用户的ID,并给出一个以下结构的结果:

{"links": [{"rel": "self","href": "http://localhost:8080/users/2"}, {"rel": "customers","href": "http://localhost:8080/users/2/customers"}, {"rel": "photo","href": "http://localhost:8080/users/2/photo"}],"id": 2,"firstName": "Lois","profilePhotoMediaType": null,"lastName": "Lane","username": "loislane","password": null,"profilePhotoImported": false,"enabled": true,"signupDate": 1370201631000
}

为了获得该用户的特定客户,端点位于http:// localhost:8080 / users / 2 / customers / 17,它提供以下结构的输出:

{"links": [{"rel": "self","href": "http://localhost:8080/users/2/customers/17"}, {"rel": "user","href": "http://localhost:8080/users/2"}],"id": 17,"signupDate": 1372461079000,"firstName": "Scott","lastName": "Andrews","databaseId": 17
}

现在,对于这两种服务的使用者而言,结果可以由Spring-hateoas项目中的一个称为Resource的Java类型表示,并且是具有以下签名的泛型类:

public class Resource<T> extends ResourceSupport {protected Resource() {this.content = null;}public Resource(T content, Link... links) {this(content, Arrays.asList(links));}...

因此,以上两种服务的使用者将获得以下两种类型:

Resource<User> user = .... //call to the serviceResource<Customer> customer = ... //call to the service

现在的问题是,由于上面的“用户”和“客户”是参数化类型,如果我要使用杰克逊作为json处理器绑定这些类型,我将按照以下方式进行操作:

ObjectMapper objectMapper = new ObjectMapper();
Resource<Customer> customer = objectMapper.readValue(customerAsJson, Resource.class);
Resource<User> user = objectMapper.readValue(userAsJson, Resource.class);

上面的方法不起作用,原因是由于Java类型擦除导致参数化Resource的类型信息丢失,Jackson不知道创建Resource <User>或Resource <Customer>的实例

解决方法是使用超类型令牌 ,这实质上是一种提供像杰克逊库类型的信息和我以前的博客上讲述它在这里 。 这样,将json映射到适当的参数化类型的工作代码将如下所示:

ObjectMapper objectMapper = new ObjectMapper();
Resource<Customer> customer = objectMapper.readValue(customerAsJson, new TypeReference<Resource<Customer>>() {});
Resource<User> customer = objectMapper.readValue(userAsJson, new TypeReference<Resource<User>>() {});

Spring的基于Rest的服务的客户端抽象是RestTemplate ,它可以使用称为HttpMessageConverter的抽象处理各种消息格式(xml,json,atom等),以处理每种消息格式的绑定细节。

Spring RestTemplate提供了自己的Super Type令牌实现,能够按照Jackson的TypeReference的路线将不同的消息格式绑定到参数化类型,这被称为ParameterizedTypeReference 。

ParameterizedTypeReference可用于通过以下方式将用户和客户的Rest响应完全绑定到Java类型:

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Resource<User>> responseEntity =restTemplate.exchange("http://localhost:8080/users/2", HttpMethod.GET, null, new ParameterizedTypeReference<Resource<User>>() {}, Collections.emptyMap());
if (responseEntity.getStatusCode() == HttpStatus.OK) {Resource<User> userResource = responseEntity.getBody();User user = userResource.getContent();
}
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Resource<Customer>> responseEntity =restTemplate.exchange("http://localhost:8080/users/2/customers/17", HttpMethod.GET, null, new ParameterizedTypeReference<Resource<Customer>>() {}, Collections.emptyMap());
if (responseEntity.getStatusCode() == HttpStatus.OK) {Resource<Customer> customerResource = responseEntity.getBody();Customer customer = customerResource.getContent();
}

总之,ParameterizedTypeReference提供了一种处理参数化类型的巧妙方法,并且在使用基于Spring Hateoas的REST服务时非常有用。

参考: all和其他博客中使用我们的JCG合作伙伴 Biju Kunjummen 提供的Spring RestTemplate和Super类型令牌使用Spring-hateoas Rest服务 。

翻译自: https://www.javacodegeeks.com/2014/01/consuming-spring-hateoas-rest-service-using-spring-resttemplate-and-super-type-tokens.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ansible-playbook 实战案例 全网备份 实时备份

目录 ansible-playbook 基础介绍1.YAML三板斧2. ansible playbook 安装apache 示例案例 全网备份 实时备份环境规划目录规划base.yamlrsync.yamlnfs.yamlsersync.yamlweb.yamlmail.yamlansible-playbook 基础介绍 playbook是由一个或多个模块组成的&#xff0c;使用多个不同的模…

iview 级联选择组件_使用 element-ui 级联插件遇到的坑

需求描述【省市区三级联动】组件&#xff1a;Cascader 级联选择器后端需要所选中的地区的名字&#xff0c;如&#xff1a;[北京市, 北京市, 东城区]获取后端省市区具体列表的接口返回数据&#xff1a;// 省 - 参数1 [{value: 1,label: 北京市},... ] // 市 - 参数2 [{value: 1,…

python高级语法装饰器_Python高级编程——装饰器Decorator超详细讲解上

Python高级编程——装饰器Decorator超详细讲解&#xff08;上篇&#xff09;送你小心心记得关注我哦&#xff01;&#xff01; 进入正文全文摘要 装饰器decorator&#xff0c;是python语言的重要特性&#xff0c;我们平时都会遇到&#xff0c;无论是面向对象的设计或者是使用相…

深入理解CPU和异构计算芯片GPU/FPGA/ASIC (上篇)

王玉伟&#xff0c;腾讯TEG架构平台部平台开发中心基础研发组资深工程师&#xff0c;专注于为数据中心提供高效的异构加速云解决方案。目前&#xff0c;FPGA已在腾讯海量图片处理以及检测领域已规模上线。 随着互联网用户的快速增长&#xff0c;数据体量的急剧膨胀&#xff0c;…

jenkins-基础配置

一&#xff0c;配置远程连接服务器 系统管理 --> 系统设置 SSH remote hosts 二&#xff0c;设置docke的URL&#xff08;设置jenkins构建镜像时候所连接的docker url &#xff0c;参考 docker开启远程访问https://www.cnblogs.com/galsnag/articles/10069709.html&#xf…

JSF:直接从页面将参数传递给JSF操作方法,这是JavaEE 6+的一个不错的功能

Java企业版JavaEE 6中提供的JSF 2的一项不错的功能是&#xff0c;您可以将参数传递给任何操作组件&#xff08;例如commandButton或commandLink组件&#xff09;的操作方法。 基于此&#xff0c;您可以最大程度地减少托管bean中的方法数量。 另外&#xff0c;为了最小化在bea…

CCF CSP个人题解汇总

趁着这波考CCF热来骗一波访问量 祝自己免修算法RP 区域赛RP 1、2题汇总在这&#xff1a;https://www.cnblogs.com/QAQorz/p/9650890.html 201803-4 棋局评估&#xff08;对抗搜索&#xff09;&#xff1a;https://www.cnblogs.com/QAQorz/p/9650828.html 201709-4 通信网络&…

海洋主题绘画_深圳举办风帆时代海洋绘画作品展,展出作品600余件

12月12日&#xff0c;第七届《风帆时代海洋绘画作品展》在位于蛇口邮轮中心3楼的深圳大学海洋文化科普教育基地举行开幕仪式。该项目得到深圳市宣传文化事业专项基金支持&#xff0c;由深圳大学海洋艺术研究中心主办&#xff0c;深圳市海洋文化艺术研究会承办。作为开幕式重要环…

不要被约束的意思_不要再奢望你会变得自律了丨“他律”比“自律”更重要

高三寒假和同学打赌一个假期做完400套卷子。否则给他1000元。。。然后每天早上六点晚上12点&#xff0c;春节也没过&#xff0c;最后做完了卷子&#xff0c;我也完成了自己的梦想&#xff01;&#xff01;&#xff01;然而上面这个大神不是我&#xff0c;是我引用的一颗真实栗子…

一篇文章为你深度解析HTTPS 协议

一、前言 微信小程序如期发布&#xff0c;开发者在接入微信小程序过程中&#xff0c;会遇到以下问题&#xff1a; 小程序要求必须通过 HTTPS 完成与服务端通信&#xff0c;若开发者选择自行搭建 HTTPS 服务&#xff0c;那需要自行 SSL 证书申请、部署&#xff0c;完成 https …

Shadow DOM及自定义标签

参考链接&#xff1a;点我 一、什么是Shadow DOM Shadow DOM&#xff0c;直接翻译的话就是 影子 DOM&#xff0c;可以理解为潜藏在 DOM 结构中并且我们无法直接控制操纵的 DOM 结构。类似于下面这种结构 Shadow DOM 可以在浏览器中生成一个独立于DOM树之外的 DOM结构 二、Shado…

二进制逆向工程师_利用Ghidra逆向分析Go二进制程序(下篇)

(接上文)动态分配字符串结构在第一种情况下&#xff0c;字符串结构是在运行时创建的&#xff0c;为此&#xff0c;需要使用一系列汇编指令在字符串操作之前设置相应的结构。由于指令集的不同&#xff0c;不同的架构之间的结构也是不同的。让我们通过几个案例&#xff0c;来展示…

工艺路线和工序有差别吗_你知道吗?市政道路排水工程的主要工序施工工艺是什么...

易筑教育给排水课程火热招生中&#xff01;张老师微信号&#xff1a;yizhujiaoyu999市政道排工程施工遵循的基本顺序是&#xff1a;先地下&#xff0c;后地上&#xff1b;先深后浅。按照这个顺序&#xff0c;正常的施工顺序为基础处理、排水管道(涵)施工(雨、污水)、道路基层(常…

如何:从Spring 4.0快速入门以构建简单的REST-Like API(演练)

如何&#xff1a;从Spring 4.0快速入门以构建简单的REST-Like API&#xff08;演练&#xff09; 关于使用Spring MVC创建Web API的另一篇教程。 不太复杂。 只是一个演练。 生成的应用程序将提供简单的API&#xff0c;将Mongo作为其持久性&#xff0c;并将通过Spring Security进…

01-Web客户端与服务器详解

1、CS与BS 软件使用方式上两种划分  C/S架构 Client/ServerPC客户端、服务器架构 特点&#xff1a;   在服务器当中就主要是一个数据库&#xff0c;把所有的业务逻辑以及界面都交给客户端完成 优点&#xff1a;   较为安全&#xff0c;用户界面丰富&#xff0c;用户体验好…

java之Hibenate中监听事件的重写和二级cache缓存

管理缓存和统计缓存 Cache cache sessionFactory.getCache(); //清除指定的News对象 cache.evictEntity(News.class, id); //清除所有的news对象 cache.evictEntityRegion(News.class); //清除指定id的news所关联的参与者集合属性 cache.evictColleciton("News.actors&q…

axi ps读写pl_PL读写DDR:Datamover能干什么

最近发现工程项目中一直在用AXI-DMA。这玩意儿搬数据倒是没问题&#xff0c;就是用axi-lite配置起来非常反人类。。。简单的办法其实是用datamover ip核。这个ip核能干嘛呢。准备写个文章解析一下。由于好多feature没用过&#xff0c;所以仅仅看文档可能理解有误&#xff0c;欢…

在10分钟内在新Mac中设置Java开发环境(更新)

这只是一个小的更新文章&#xff0c;它引用了2个较旧的条目&#xff08; a &#xff0c; b &#xff09;&#xff0c;我将它们合并为一个步骤&#xff0c;就像一步操作&#xff0c;并确保所有功能都在最新的MacOSX 10.9 Mavericks下工作 。 我主要针对的是初次尝试设置其环境的…

linux path 与 classpath 区别

linux path 与 classpath 区别 一、OS依据path中的路径信息来寻找可执行指令&#xff1b; 例如&#xff1a; cat /etc/profile 我们就可以在任意目录执行hadoop / hdfs / yarn / java 等相关命令了 export HADOOP_HOME/opt/hadoop/hadoop-2.6.0 export JAVA_HOME/home/jdk1.8.0…

开启9008端口进入深刷模式

除了前文所述&#xff0c;使用深刷线&#xff0c;还可以用命令开启9008端口&#xff0c;进入深刷模式。 adb reboot edl fastboot oem edl 这个在小米4c上测试ok 下面这个可能用于其他手机。 fastboot reboot emergency http://www.znsjw.net/nd.jsp?id19 小米绕BL锁9008工程…