jersey spring

Jersey是Oracle提供的出色的Java JAX-RS规范参考实现。 去年,当我们开始为大容量网站构建RESTful后端Web服务时,我们选择使用JAX-RS API作为我们的REST框架和Spring框架来进行依赖项注入。 泽西岛是我们选择的JAX-RS实现。

项目启动时,JAX-RS API 2.0规范尚未发布,Jersey 2.0也未发布。 由于我们没有发现JAX-RS 1.1的任何根本缺陷,并且因为存在针对Jersey 1.1的稳定的Spring集成模块,所以我们决定使用经过实践检验的版本,而不是采用前沿技术。

尽管如此,我还是想知道采用较新版本会获得什么,所以我开始在空闲时间查看JAX-RS 2 API并使用Jersey 2进行原型制作。我注意到Jersey 2缺乏与Spring框架集成的功能,适用于以前的版本。 进一步研究该问题,我发现旧的Spring集成模块无法直接移植到Jersey2。原因是Jersey 1建立在自定义内部依赖注入框架上,而Jersey 2已切换到HK2进行依赖注入。 ( HK2是在GlassFish中使用的有趣的,轻量级的依赖注入框架。)

我实现Jersey-Spring集成的最初目标非常简单:

将在应用程序上下文XML中声明的Spring bean注入JAX-RS资源类(使用@Autowired批注或XML配置)

因此,我认为我需要更深入地研究,并开始研究Jersey源代码。 我很高兴地注意到,泽西岛的开发正在以开放和平易近人的方式进行。 源代码托管在GitHub上并经常更新。 经过一段时间的挖掘,Jersey Spring集成的高级设计开始形成。 在第一个可运行的原型制作之前,进行了大量的实验和多次迭代。 那时,作为一个乐观主义者,我希望我快完成了,并联系了球衣用户的邮件列表以获取有关设计和实现的反馈。 反馈:添加更多用例,提供示例代码,实现测试自动化,签署Oracle贡献者协议(从泽西软件产品的角度来看,反馈当然是非常合理的)。 因此,虽然还没有完全回到绘图板上,但是到了这一点,我意识到最后一英里要比我期望的要长得多。

最终,Jersey-Spring集成最终合并到Jersey v2.2版本的Jersey 2代码库中。 集成API基于注释,并支持以下功能:

  • 将Spring bean注入到Jersey管理的JAX-RS资源类中(使用org.springframework.beans.factory.annotation.Autowired或javax.inject.Inject)。 @Qualifier和@Named批注可用于进一步限定注入的实例。
  • 允许JAX-RS资源类实例生命周期由Spring而不是Jersey管理(org.springframework.stereotype.Component)
  • 支持不同的Spring bean注入范围:单例,请求,原型。 Bean作用域在applicationContext.xml中声明。

实施

可以在主Jersey源存储库中找到Jersey-Spring集成的源代码: https : //github.com/jersey/jersey/tree/2.5.1/ext/spring3/src/main/java/org/glassfish/球衣/服务器/Spring

Jersey-Spring集成包含以下实现类:

org.glassfish.jersey.server.spring.SpringComponentProvider

此ComponentProvider实现已向Jersey SPI扩展机制注册,并负责引导Jersey 2 Spring集成。 它使Jersey跳过了Spring组件的JAX-RS生命周期管理。 否则,Jersey会将这些类绑定到具有Jersey默认范围的HK2 ServiceLocator,而无需遵守为Spring组件声明的范围。 此类还初始化HK2弹簧桥,并向HK2 ServiceLocator注册Spring @Autowired注释处理程序。 当在servlet上下文之外运行时,将自定义org.springframework.web.context.request.RequestScope实现配置为实现Bean的请求范围。

org.glassfish.jersey.server.spring.AutowiredInjectResolver

HK2注入解析器,该注入器注入使用Spring框架@Autowired批注声明的依赖项。 HK2调用此解析器,并要求它解析使用@Autowired注释的依赖项。

org.glassfish.jersey.server.spring.SpringLifecycleListener

处理容器生命周期事件。 重新加载时刷新Spring上下文,并在关闭时将其关闭。

org.glassfish.jersey.server.spring.SpringWebApplicationInitializer

一个便利类,可以帮助用户避免在web.xml中配置Spring ContextLoaderListener和RequestContextListener。 或者,用户可以在Web应用程序web.xml中配置它们。

除了实际的实现代码外,该集成还包括示例和测试 ,这对于使开发人员入门非常有帮助。

JAX-RS规范定义了自己的依赖项注入API。 另外,Jersey支持不受JAX-RS规范要求的JSR 330样式注入。 Jersey-Spring集成增加了对Spring样式注入的支持。 JAX-RS注入和Spring集成都提供了一种将对象绑定到注册表中的机制,以便以后可以查找和注入对象。 如果使用的是完整的Java EE应用程序服务器(例如Glassfish),则还可以选择通过CDI API绑定对象。 在非Java EE环境中,可以通过嵌入容器实现(例如Weld)来使用CDI。 另一个绑定方法是使用Jersey特定的API。 测试代码包括一个JAX-RS应用程序类,该类演示了如何完成此工作。

修改球衣Spring

如果您想在Jersey-Spring上工作,则需要检查并构建Jersey 2代码库。 该过程相当容易并且有据可查: https : //jersey.java.net/documentation/2.5.1/how-to-build.html

您只需要克隆存储库并构建源即可。 构建系统基于Maven。 您还可以使用其Maven插件轻松地将代码库导入所选的IDE(与IDEA 12,Eclipse 4.3和NetBeans 8.0 beta进行了尝试)。 但是,我注意到,某些集成测试在Maven 3.0中失败了,我不得不升级到3.1,但是除此之外,没有任何问题。

构建Jersey 2之后,您可以修改Spring集成模块,并仅构建更改的模块以节省时间。

测验

Jersey-Spring集成测试已使用Jersey测试框架构建 ,并且在maven-failsafe-plugin的控制下运行。 集成测试由实际的测试代码和测试执行的JAX-RS后端Webapp组成。 使用jetty-maven-plugin将后端部署到外部Jetty servlet容器中。 Jersey-Spring测试可以与其余测试分开执行。 集成测试可在以下单独的Maven子模块中找到: https : //github.com/jersey/jersey/tree/2.5.1/tests/integration/spring3

除了演示Jersey-Spring的基本功能外,测试还显示了如何使用不同的Spring bean范围:单例,请求,原型。 测试还展示了使用JAX-RS应用程序类在不同范围内在容器中注册您自己的依赖项。

结论

我认为JAX-RS 2.0 API提供了一种在Java中实现RESTful接口的好方法。 Jersey JAX-RS参考实现的开发正在以公开透明的方式进行。 泽西岛还有大量活跃的用户社区。

正如小弗雷德里克·布鲁克斯(Frederick Brooks,Jr.)所说:“所有程序员都是乐观主义者”。 通常很容易低估将代码与相对较大和复杂的代码库集成所需的工作量,尤其是当您需要在多个不同框架(在本例中为Jersey,HK2和Spring框架)之间进行调解时。 另外,尽管Jersey拥有相当不错的用户文档,但我错过了有关设计和实现的高级体系结构文档。 为了确定正确的集成点,需要进行大量的探索。 幸运的是,Jersey构建系统非常易于使用,并且仅允许构建选定的零件,这使得实验和变更-构建-测试周期相对较快。

Jersey和Spring框架都提供了丰富的功能集,您可以通过多种方式一起使用它们。 当前形式的Jersey-Spring集成涵盖了两者之间的几个基本集成方案。 如果发现不支持您的特定方案,请加入jersey-users邮件列表进行讨论。 您还可以检出代码,实施更改并通过在GitHub上提交拉取请求来贡献它们。

参考:在实践技术博客上,由我们的JCG合作伙伴 Marko Asplund 实施了Jersey 2 Spring集成 。

翻译自: https://www.javacodegeeks.com/2014/02/implementing-jersey-2-spring-integration.html

jersey spring

jersey spring_实施Jersey 2 Spring集成相关推荐

  1. 实施Jersey 2 Spring集成

    Jersey是Oracle提供的出色的Java JAX-RS规范参考实现. 去年,当我们开始为大容量网站构建RESTful后端Web服务时,我们选择使用JAX-RS API作为我们的REST框架和Sp ...

  2. java 集成grizzly_java – 与Jersey和Spring集成Grizzly2.2.X

    我已经成功地将Grizzly v2.1.9与Jersey和 Spring集成在一起.但是在尝试将Grizzly迁移到版本2.2.19时无法使其工作. Grizzly v2.1.9的原始代码如下. Ht ...

  3. apache camel_轻量级的开源集成:Apache Camel还是Spring集成?

    apache camel 首先,为全面披露信息,在过去的1.5年中, 我一直担任 FuseSource(现为Red Hat) 的顾问,为零售,运输,银行/金融等不同行业的大型和小型公司提供SOA和集成 ...

  4. 将Quartz与Spring集成

    在Java应用程序中调度作业时,Quartz是第一个考虑的工具. Quartz是由最流行的RDBMS支持的作业调度程序. 这真的很方便,并且很容易与spring集成. 为了创建石英模式,您必须下载石英 ...

  5. Spring集成和Web服务

    本文是我们名为" Spring Integration for EAI "的学院课程的一部分. 在本课程中,向您介绍了企业应用程序集成模式以及Spring Integration如 ...

  6. 轻量级的开源集成:Apache Camel还是Spring集成?

    首先,为全面披露信息,在过去的1.5年中, 我一直担任 FuseSource(现为Red Hat) 的顾问,为零售,运输,银行/金融等不同行业的大型和小型公司提供SOA和集成项目支持.我的专长是使用该 ...

  7. Spring集成文件轮询和测试

    我最近实施了一个小项目,在该项目中,我们必须轮询文件夹中的新文件,然后在文件内容上触发服务流. Spring Integration非常适合此要求,因为它带有一个通道适配器 ,该适配器可以扫描文件夹中 ...

  8. Spring集成Redis方案(spring-data-redis)(基于Jedis的单机模式)(待实践)

    说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点.并且会与一些低版本的Sp ...

  9. windows api中文文档_Web服务开发:Spring集成Swagger,3步自动生成API文档

    目录: 1,Spring Boot集成Swagger 2,Swagger接口文档页面 3,常见问题和解决方法 在Sping开发REST接口服务时,API文档是不可缺少的一个重要部分.Swagger框架 ...

最新文章

  1. 051_原码反码补码概念
  2. 【Python基础】零基础学习Python列表操作
  3. 旋转排序数组系列题详解
  4. 转载 Android解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
  5. C#中在主窗体中用ShowDialog方法显示子窗体的使用技巧
  6. Python线程安全问题及解决方法
  7. 图说Hadoop HA
  8. catalina 无法验证macos_拿什么拯救你,我的macOS Catalina——完整版补救措施来啦...
  9. 妈耶,摆脱机器音,二次宅的歌姬女友彻底活了
  10. 容器化运行wine模拟器制作开源代码索引chm文件
  11. 交换机、路由器和防火墙的原理和区别
  12. Java - 使用Cipher类实现加密(RSA)
  13. 西工大计算机学院优秀毕业生,计算机学院优秀博士毕业生陈穆林:不负时光 不负自己 奋斗的时光是一抹永不褪色记忆...
  14. 三角函数的倍角、半角与降幂公式
  15. swal 弹窗html页面,SweetAlert - 演示6种不同的提示框效果
  16. 相伴女人一生的爱情语录[组图]
  17. 阿里云新购服务器磁盘disk挂载完整教程
  18. Excel 函数Min求最小值值为空时为零的情况如何处理,或者排除0怎么做
  19. 宇视录像机多种协议添加摄像机(只介绍常用的宇视、onvif、GB28181三种协议)
  20. conda命令下载包报错总结

热门文章

  1. csp初赛复习(往年真题+解析)
  2. codeforces gym-101745 C-Infinite Graph Game 分块
  3. 服务器性能指标(二)——CPU利用率分析及问题排查
  4. 集合框架 Queue---BlockingQueue详解
  5. Java压缩技术(三) ZIP解压缩——Java原生实现
  6. 【Servlet】获取并输出服务器获得的数据
  7. 【博客】csdn搬家到wordpress
  8. JS中使用工厂模式创建对象
  9. sql 注射_令人惊讶的注射
  10. 迁移学习 简而言之_简而言之SPIFFE