jax-ws和jax-rs_使用JAX-RS和Spring构建HATEOAS API

jax-ws和jax-rs

在我以前的博客文章中,我展示了如何使用Spring Boot配置Jersey多么容易。 我对Spring Boot和Jersey的探索并未结束,我研究了在Spring Boot应用程序中将Spring HATEOAS与Jersey一起使用的可能性。 Spring HATEOS允许创建遵循HATEOAS原理的REST表示形式,并且(截至撰写本文时)具有使用链接的基本JAX-RS支持。 在此博客文章中,我将分享一些示例说明如何将Spring HATEOAS与Jersey集成到Spring Boot应用程序中。

介绍

作为本文的基础,我使用了之前创建的示例:( https://github.com/kolorobot/spring-boot-jersey-demo )。

为了开始使用Spring HATEOAS,我将有效依赖项添加到build.gradle

compile("org.springframework.hateoas:spring-hateoas:0.16.0.RELEASE")

使用

生成实体对象( Customer )表示的最快方法是使用Spring HATEOAS ResourceResources助手。 后者包装了CustomerRepository返回的实体的集合。 为了生成链接,我使用了JaxRsLinkBuilder ,它通过基于@Path注释发现路径来帮助构建到JAX-RS资源的资源链接。

@Component
@Path("/customer")
@Produces(MediaType.APPLICATION_JSON)
public class CustomerController {@Injectprivate CustomerRepository customerRepository;@GETpublic Response findAll() {Resources<Customer> resources = new Resources<>(customerRepository.findAll(),JaxRsLinkBuilder.linkTo(CustomerController.class).withSelfRel());return Response.ok(resources).build();}

调用上述方法的结果将是带有自相关链接的集合资源:

{"links": [{"rel": "self","href": "http://localhost:8080/customer"}],"content": [{"id": 1,"firstname": "Dave","lastname": "Matthews","emailAddress": {"value": "dave@dmband.com"}}]
}

使用

ResourceResourcesPagedResources帮助器非常方便,但是在某些情况下需要对创建的资源进行更多控制。

要从实体创建自定义传输对象,可以使用ResourceSupport基类:

public class CustomerResource extends ResourceSupport {private String fullName;private String email;}

要从实体组装CustomerResource并自动向其添加自相关链接,应使用ResourceAssemblerSupport类。 基本上,此类负责实例化资源并添加具有rel自指向资源的链接:

public class CustomerResourceAssembler extends ResourceAssemblerSupport<Customer, CustomerResource> {public CustomerResourceAssembler() {super(CustomerController.class, CustomerResource.class);}@Overridepublic CustomerResource toResource(Customer entity) {CustomerResource resource = createResourceWithId(entity.getId(),entity);// initialize the resource        return resource;}
}

我在上面的代码中遇到的问题是ResourceAssemblerSupport类在内部使用链接构建器来构建到Spring MVC控制器( ControllerLinkBuilder )的链接。 这导致链接无效。

除了创建从ResourceAssemblerSupport扩展并覆盖其父级行为的新支持类外,我没有发现其他方法:

public abstract class JaxRsResourceAssemblerSupport<T, D extends ResourceSupport>extends ResourceAssemblerSupport<T, D> {private final Class<?> controllerClass;public JaxRsResourceAssemblerSupport(Class<?> controllerClass, Class<D> resourceType) {super(controllerClass, resourceType);this.controllerClass = controllerClass;}@Overrideprotected D createResourceWithId(Object id, T entity, Object... parameters) {Assert.notNull(entity);Assert.notNull(id);D instance = instantiateResource(entity);instance.add(JaxRsLinkBuilder.linkTo(controllerClass, parameters).slash(id).withSelfRel());return instance;}
}

我真的不喜欢上面的解决方案,因为我需要复制和粘贴一些代码,但是我没有找到实现我想要的更好的方法。

我的汇编器现在从新创建的JaxRsResourceAssemblerSupport

public class CustomerResourceAssembler extends JaxRsResourceAssemblerSupport<Customer, CustomerResource> {}

最后,我可以修改控制器的方法以返回由我的汇编器汇编的资源。 请注意, ResourceAssemblerSupport提供了方便的方法来将所有给定的实体转换为资源:

@GET
@Path("/resources")
public Response findAll() {Iterable<Customer> customers = customerRepository.findAll();CustomerResourceAssembler assembler = new CustomerResourceAssembler();List<CustomerResource> resources = assembler.toResources(customers);return Response.ok(wrapped).build();
}

要添加具有自定义链接的链接到集合资源,我需要使用前面提到的Resources类包装它:

// wrap to add link
Resources<CustomerResource> wrapped = new Resources<>(resources);
wrapped.add(JaxRsLinkBuilder.linkTo(CustomerController.class).withSelfRel()
);

现在返回的表示看起来更像是HATEOAS:

{"links": [{"rel": "self","href": "http://localhost:8080/customer"}],"content": [{"fullName": "Matthews, Dave","email": "dave@dmband.com","links": [{"rel": "self","href": "http://localhost:8080/customer/1"}]}]
}

使用

EntityLinks接口提供API以根据实体类型创建链接,并且@EnableEntityLinks@EnableHypermadiaSupport@ExposesResourceFor一起使用时,可用于依赖项注入。 @ExposesResourceFor公开Spring MVC控制器或JAX-RS资源管理的实体类型。

在配置类中,我们需要激活实体链接:

@SpringBootApplication
@EnableEntityLinks
public class Application {}

注意:请注意,使用实体链接和@EnableEntityLinks ,以下依赖项必须位于类路径上:

compile("org.springframework.plugin:spring-plugin-core:1.1.0.RELEASE")

任何支持实体类型的JAX-RS资源都必须使用@ExposesResourceFor进行标记,以便可以注入EntityLinks

@ExposesResourceFor(Customer.class)
public class CustomerController {@Injectprivate EntityLinks entityLinks;
}

基本上, EntityLinks接口提供了返回指向集合资源或单个资源的链接的方法。 例:

Link selfRel = entityLinks.linkToSingleResource(Customer.class, customer.getId()
).withSelfRel();

摘要

Spring HATEOAS不是使用JAX-RS和Jersey构建HATEOAS API的唯一选择,但是有可能在Spring Boot应用程序中使用Jersey,Spring HATEOAS可能是一个不错的补充,尤其是考虑到JAX-RS的设计。

注意:本文只是我针对所述主题进行的一项研究。 我尚未在任何项目中使用该方法。

资源资源

  • 项目源代码: https : //github.com/kolorobot/spring-boot-jersey-demo
  • SpringHATEOAS项目页面: https : //github.com/spring-projects/spring-hateoas和示例: https : //github.com/olivergierke/spring-hateoas-sample

翻译自: https://www.javacodegeeks.com/2015/01/building-a-hateoas-api-with-jax-rs-and-spring.html

jax-ws和jax-rs

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

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

相关文章

C this指针的理解和作用

C 程序到 C 程序的翻译 要想理解 C 的 this 指针&#xff0c;我们可以先把下面的 C 代码转换成 C 代码&#xff1a;C 语言是没有类定义 class 关键词&#xff0c;但是有跟 class 类似的定义&#xff0c;那就是 struct 结构体。m_price 变量是 Car 类的成员变量&#xff0c;那…

yolov3安卓实现_YOLOv3 的 TensorFlow 实现,GitHub 完整源码解析

来自华盛顿大学的 Joseph Redmon 和 Ali Farhadi 提出的YOLOv3 通过在 YOLO 中加入设计细节的变化&#xff0c;这个新模型在取得相当准确率的情况下实现了检测速度的很大提升&#xff0c;一般它比 R-CNN 快 1000 倍、比 Fast R-CNN 快 100 倍。这里附上 YOLOv3 的论文地址&…

C++ inline 函数简介

1.inline 函数简介inline 函数由 inline 关键字定义&#xff0c;引入 inline 函数的主要原因是用它替代 C 中复杂易错不易维护的宏函数。2.编译器对 inline 函数的处理办法编译器在编译阶段完成对 inline 函数的处理&#xff0c;即对 inline 函数的调用替换为函数的本体。但 in…

intellij ide_UltraESB的首选IDE – IntelliJ IDEA

intellij ide在AdroitLogic&#xff0c;我们长期以来一直在使用IntelliJ IDEA进行开发。 它是Java和相关语言/技术的最佳IDE&#xff08;它可能也是许多其他语言的选择&#xff0c;但我的经验主要是Java和相关技术&#xff09;。 Groovy和IDEA的Grails的集成很棒。 通过自动发…

install npm 到某个文件下执行_如何将npm安装到指定目录?

从npm版本3.8.6开始&#xff0c;您可以使用npm install --prefix ./install/here 安装在指定的目录中。node_modules即使node_modules较高层次结构中已存在目录&#xff0c;NPM 也会自动创建文件夹。您还可以package.json在当前目录中拥有a &#xff0c;然后使用以下--prefix选…

android 启动界面位置,android 修改默认启动项launcher(一)

需求&#xff1a;不去掉系统自带launcher的前提下&#xff0c;默认启动指定应用作为launcher现象&#xff1a;应用中带有属性"android.intent.category.HOME"&#xff0c;开机会弹出选择界面思路&#xff1a;跳过选择界面&#xff0c;直接选中要启动的launcher并直接…

C++抽象类

概念在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。抽象类往往用来表征对问题领域进行分…

iview select选中值取值_iView的Select选择框

目录在此先列出解决了那些问题&#xff0c;以防读者看完了没有用处&#xff1a;1、示例&#xff0c;最基础的使用方法2、传参&#xff0c;传多个值的方式3、默认值4、清空重置无效5、可搜索的用法及如何限制搜索字符长度一、示例html:{{item.name}}js:data: {formSend: {name: …

tibco_TIBCO产品的微服务和DevOps

tibco大家都在谈论微服务 &#xff0c;这些天。 您可以在数百篇文章和博客文章中读到很多有关微服务的信息。 马丁福勒 &#xff08; Martin Fowler &#xff09;的文章是一个很好的起点&#xff0c;该文章引发了有关这种新架构概念的大量讨论。 另一个不错的资源是独立于供应…

android 冰箱 活动,Android活动的使用

创建第一个应用&#xff1a;步骤一&#xff1a;1、Activity :一个页面2、Layout &#xff1a;页面布局3、Res&#xff1a;页面内的资源注意&#xff1a;所有的Activity都是继承与android.app.activity类&#xff0c;通过override实现。简单理解Activity 代表一个用户所能看到的…

C atoi函数

作用atoi()函数将数字格式的字符串转换为整数类型。例如&#xff0c;将字符串1253124127转换成数字1253124127。注意首要注意atoi函数可以转化如下这种字符串1fdafhdjfhkas关于参数的注意事项&#xff0c;atoi()函数的参数是要转换的字符串。该字符串的格式为[空格][符号][数字…

python lock_python多线程Lock和RLock的区别

python多线程Lock和RLock的区别1. 两种锁的不同1.1 定义为了确保对共享资源的访问&#xff0c;python提供了两种锁&#xff0c;一个是上一篇提到的Lock&#xff0c;还有一个就是RLock&#xff0c;他们的区别在于&#xff1a;Lock是可用的最低级别的同步指令&#xff0c;一个线程…

开式蓄冷罐与闭式蓄冷罐_一罐将其全部统治:Arquillian + Java 8

开式蓄冷罐与闭式蓄冷罐借助Java 8 &#xff0c;已实现了许多新的语言改进&#xff0c;以简化开发人员的生活。 在我看来&#xff0c; Java 8的最大优点之一是&#xff0c;在某些情况下&#xff0c;已开发的代码看起来比使用以前的方法更漂亮&#xff0c;我指的是Lambdas和Meth…

C 预处理指令

C 预处理指令C语言、C 语言的预处理器。用于在编译器处理程序之前预扫描源代码&#xff0c;完成头文件的包含, 宏扩展, 条件编译, 行控制&#xff08;line control&#xff09;等操作编译的四个阶段C语言标准规定&#xff0c;预处理是指前4个编译阶段&#xff08;phases of tra…

将html代码转换为dom,将HTML字符转换为DOM节点并动态添加到文档中

将HTML字符转换为DOM节点并动态添加到文档中将字符串动态转换为DOM节点&#xff0c;在开发中经常遇到&#xff0c;尤其在模板引擎中更是不可或缺的技术。字符串转换为DOM节点本身并不难&#xff0c;本篇文章主要涉及两个主题&#xff1a;1 字符串转换为HTML DOM节点的基本方法及…

python 的csr_python的高级数组之稀疏矩阵

稀疏矩阵的定义&#xff1a;具有少量非零项的矩阵(在矩阵中&#xff0c;若数值0的元素数目远多于非0元素的数目&#xff0c;并且非0元素分布没有规律时&#xff0c;)则称该矩阵为稀疏矩阵&#xff1b;相反&#xff0c;为稠密矩阵。非零元素的总数比上矩阵所有元素的总数为矩阵的…

通过Spring集成进行消息处理

Spring Integration提供了Spring框架的扩展&#xff0c;以支持著名的企业集成模式。 它在基于Spring的应用程序中启用轻量级消息传递&#xff0c;并支持与外部系统的集成。 Spring Integration的最重要目标之一是为构建可维护且可测试的企业集成解决方案提供一个简单的模型。 …

鸿蒙系统多会发布,华为官宣鸿蒙系统将发布,还将发布多款新品

华为今日官宣&#xff0c;6月2日20&#xff1a;00&#xff0c;将举行鸿蒙操作系统及华为全场景新品发布会。【1、鸿蒙OS2.0】本次发布会的重点将是推出华为今年的重点战略产品——鸿蒙系统。届时鸿蒙OS2.0正式版将陆续推送给手机用户。5月中旬时华为就先行推送了一波鸿蒙OS开发…

C语言结构体字节对齐

默认字节对齐C语言结构体字节对齐是老生常谈的问题了&#xff0c;也是高频面试题&#xff0c;现在我们来深入研究这个问题&#xff0c;彻底弄懂到底是怎么回事&#xff0c;给你一个结构体定义和平台机器位数就能手动计算出结构体占用字节数&#xff0c;现在我们不使用宏#pragma…

shell shocked伴奏版_Shell Shocked

【游戏简介】Shell Shocked是一款全新卡牌对战题材的策略类手机游戏。游戏有着丰富的卡牌种类&#xff0c;极具策略性的玩法。游戏中玩家可以将进行真人游戏对战&#xff0c;随机抽取卡牌对战。玩家必须采取适合的策略&#xff0c;才有可能赢取游戏。 游戏操作简单&#xff0c;…