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

jax-ws和jax-rs_使用JAX-RS和Spring构建HATEOAS API相关推荐

  1. spring和maven_具有Spring和Maven教程的JAX–WS

    spring和maven Spring框架通过JAX-WS提供对Web服务的远程支持,实际上,如Spring 参考文档中所述 ,有三种将Spring POJO服务公开为JAX-WS Web服务的方式: ...

  2. 带有Spring和Maven教程的JAX–WS

    Spring框架通过JAX-WS提供对Web服务的远程支持,实际上,如Spring 参考文档中所述 ,有三种将Spring POJO服务公开为JAX-WS Web服务的方式: 公开基于Servlet的 ...

  3. 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 ...

  4. boot jersey_Jersey和Spring Boot入门

    boot jersey 除了许多新功能,Spring Boot 1.2还带来了Jersey支持. 这是吸引喜欢标准方法的开发人员的重要一步,因为他们现在可以使用JAX-RS规范构建RESTful AP ...

  5. Jersey和Spring Boot入门

    除了许多新功能,Spring Boot 1.2还带来了Jersey支持. 这是吸引喜欢标准方法的开发人员的重要一步,因为他们现在可以使用JAX-RS规范构建RESTful API,并将其轻松部署到To ...

  6. Java Code Geeks Andygene Web原型

    大家好, 我们很高兴地宣布,一组Maven原型的第一个版本已经发布!!! 该集合的目的是提供可以满足各种开发需求的项目模板. 您可以在本文末尾找到JCG路线图. 该第一个发行版旨在提供项目模板-Web ...

  7. 2022年,我该用JAX吗?GitHub 1.6万星,这个年轻的工具并不完美

    来源:机器之心 本文约4600字,建议阅读10+分钟 你有在使用JAX吗? 近年来,谷歌于 2018 年推出的 JAX 迎来了迅猛发展,很多研究者对其寄予厚望,希望它可以取代 TensorFlow 等 ...

  8. DeepMind发布神经网络、强化学习库,网友:推动JAX发展

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 十三 发自 凹非寺 量子位 报道 | 公众号 QbitAI DeepMind今日发布了 ...

  9. Github 1.3万星,迅猛发展的JAX对比TensorFlow、PyTorch

    ©作者 | 机器之心编辑部 来源 | 机器之心 在机器学习领域,大家可能对 TensorFlow 和 PyTorch 已经耳熟能详,但除了这两个框架,一些新生力量也不容小觑,它就是谷歌推出的 JAX. ...

  10. 使用 PyTorch 数据读取,JAX 框架来训练一个简单的神经网络

    使用 PyTorch 数据读取,JAX 框架来训练一个简单的神经网络 本文例程部分主要参考官方文档. JAX简介 JAX 的前身是 Autograd ,也就是说 JAX 是 Autograd 升级版本 ...

最新文章

  1. c#_continue 和 break 的区别
  2. 本机发邮件测试mail函数
  3. CentOS 6.8 GRUB加密-修复和破解密码实战指南
  4. Spring Set注入简化写法1
  5. 121. 买卖股票的zui佳时机(JavaScript)
  6. oe_runmake failed
  7. GitHub Actions 部署 VuePress 文档
  8. python一对一视频教学-问Python,一对一直播开发需要推流器吗?
  9. 2008是中国的奥运年
  10. unity3d多个版本共存
  11. 高级php工程师需要掌握的知识点
  12. Can not connect to the Service chromedriver的解决方法
  13. 计算机到点就有音乐怎么清除缓存垃圾,如何自动清理网易音乐的缓存
  14. Axure与markman
  15. 华为P30销量破千万有多少含金量?
  16. Audit login 与 Audit logout
  17. 栈的实现(C语言版)
  18. 《数据库系统概论》复习笔记
  19. 统筹在项目中的重要性
  20. 宽带共享常见经典问题(转)

热门文章

  1. jzoj5699-[GDOI2018day1]涛涛接苹果【树套树】
  2. P5904-[POI2014]HOT-Hotels加强版【长链剖分,dp】
  3. jzoj3920-噪音【贪心,dp】
  4. P4549-[模板]裴蜀定理
  5. 2019纪中暑假游记+总结
  6. SSL-练习题目:种树 题解
  7. 9、play中缓存的使用
  8. Sentinel(八)之熔断降级
  9. 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
  10. springboot+layui从控制器请求至页面时js失效的解决方法