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 Resource
和Resources
助手。 后者包装了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"}}]
}
使用
Resource
, Resources
, PagedResources
帮助器非常方便,但是在某些情况下需要对创建的资源进行更多控制。
要从实体创建自定义传输对象,可以使用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
jax-ws和jax-rs_使用JAX-RS和Spring构建HATEOAS API相关推荐
- spring和maven_具有Spring和Maven教程的JAX–WS
spring和maven Spring框架通过JAX-WS提供对Web服务的远程支持,实际上,如Spring 参考文档中所述 ,有三种将Spring POJO服务公开为JAX-WS Web服务的方式: ...
- 带有Spring和Maven教程的JAX–WS
Spring框架通过JAX-WS提供对Web服务的远程支持,实际上,如Spring 参考文档中所述 ,有三种将Spring POJO服务公开为JAX-WS Web服务的方式: 公开基于Servlet的 ...
- jax ws ri 生成java类_JAX-WS(一)之使用wsgen从Java创建简单的WebService
概念 JAX-WS2.0的全称Java API for XML-Based Web Service 2.0.JAX-WS2.0是对JAX-RPC1.0规范的扩展,是JAX-RPC1.1的后续版本,JA ...
- boot jersey_Jersey和Spring Boot入门
boot jersey 除了许多新功能,Spring Boot 1.2还带来了Jersey支持. 这是吸引喜欢标准方法的开发人员的重要一步,因为他们现在可以使用JAX-RS规范构建RESTful AP ...
- Jersey和Spring Boot入门
除了许多新功能,Spring Boot 1.2还带来了Jersey支持. 这是吸引喜欢标准方法的开发人员的重要一步,因为他们现在可以使用JAX-RS规范构建RESTful API,并将其轻松部署到To ...
- Java Code Geeks Andygene Web原型
大家好, 我们很高兴地宣布,一组Maven原型的第一个版本已经发布!!! 该集合的目的是提供可以满足各种开发需求的项目模板. 您可以在本文末尾找到JCG路线图. 该第一个发行版旨在提供项目模板-Web ...
- 2022年,我该用JAX吗?GitHub 1.6万星,这个年轻的工具并不完美
来源:机器之心 本文约4600字,建议阅读10+分钟 你有在使用JAX吗? 近年来,谷歌于 2018 年推出的 JAX 迎来了迅猛发展,很多研究者对其寄予厚望,希望它可以取代 TensorFlow 等 ...
- DeepMind发布神经网络、强化学习库,网友:推动JAX发展
点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 十三 发自 凹非寺 量子位 报道 | 公众号 QbitAI DeepMind今日发布了 ...
- Github 1.3万星,迅猛发展的JAX对比TensorFlow、PyTorch
©作者 | 机器之心编辑部 来源 | 机器之心 在机器学习领域,大家可能对 TensorFlow 和 PyTorch 已经耳熟能详,但除了这两个框架,一些新生力量也不容小觑,它就是谷歌推出的 JAX. ...
- 使用 PyTorch 数据读取,JAX 框架来训练一个简单的神经网络
使用 PyTorch 数据读取,JAX 框架来训练一个简单的神经网络 本文例程部分主要参考官方文档. JAX简介 JAX 的前身是 Autograd ,也就是说 JAX 是 Autograd 升级版本 ...
最新文章
- c#_continue 和 break 的区别
- 本机发邮件测试mail函数
- CentOS 6.8 GRUB加密-修复和破解密码实战指南
- Spring Set注入简化写法1
- 121. 买卖股票的zui佳时机(JavaScript)
- oe_runmake failed
- GitHub Actions 部署 VuePress 文档
- python一对一视频教学-问Python,一对一直播开发需要推流器吗?
- 2008是中国的奥运年
- unity3d多个版本共存
- 高级php工程师需要掌握的知识点
- Can not connect to the Service chromedriver的解决方法
- 计算机到点就有音乐怎么清除缓存垃圾,如何自动清理网易音乐的缓存
- Axure与markman
- 华为P30销量破千万有多少含金量?
- Audit login 与 Audit logout
- 栈的实现(C语言版)
- 《数据库系统概论》复习笔记
- 统筹在项目中的重要性
- 宽带共享常见经典问题(转)
热门文章
- jzoj5699-[GDOI2018day1]涛涛接苹果【树套树】
- P5904-[POI2014]HOT-Hotels加强版【长链剖分,dp】
- jzoj3920-噪音【贪心,dp】
- P4549-[模板]裴蜀定理
- 2019纪中暑假游记+总结
- SSL-练习题目:种树 题解
- 9、play中缓存的使用
- Sentinel(八)之熔断降级
- 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
- springboot+layui从控制器请求至页面时js失效的解决方法