jersey spring_实施Jersey 2 Spring集成

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

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

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

相关文章

【渝粤教育】国家开放大学2018年春季 0688-21T老年精神障碍护理 参考试题

编号:0688 座位号 2017~2018学年度第二学期期末考试 老年精神障碍护理(开卷)试题 2018年 5月 名词解释(每题5分,共30分,) 1、器质性精神障碍 2、谵妄 3、遗忘综合征 4、器质性幻觉症 5、老…

HD-SDI光端机有哪些优势?

3G-SDI光端机适合电视行业的高清可靠、高清性能的标准,杭州飞畅的3G-SDI光端机采用最新科技,采用H.264编码方式,采用高清SDI专用VIDIO SFP光模块,一般情况下采用SDI接口。其产品最早为广电行业客户开发使用,应用于电视…

【渝粤教育】国家开放大学2018年春季 0703-21T经济学基础 参考试题

科目编号:0703 座位号 □□ 2017-2018学年度第二学期期末考试 经济学基础 试题 2018年7月 一、单项选择题:(每题4分,共40分) 经济学可以定义为( ) 政府对市场制度的干预 企业赚取利润的活动 研…

elementui可编辑单元格_ElementUI 表格可编辑单元格

页面export default{components: {EditableCell: () > import(/components/EditableCell/EditableCell.vue),},data() {return {tableData:[{date:"2020-12-01",name:"my name is elementui",address:"浙江省杭州市西湖区",}]}},methods: {on…

【渝粤教育】国家开放大学2018年春季 3896T人文英语1 参考试题

试卷代号:3896 (中央广播电视大学)2018年春季学期“开放专科”期末考试 人文英语1 试题 2018年7月 注 意 事 项 一、将你的学号、姓名及分校(工作站)名称填写在答题纸的规定栏内。考试结束后,把试卷和答题纸…

如何以及为什么使用Spoon分析,生成和转换Java代码

Spoon是分析,生成和转换Java代码的工具。 在本文中,我们将看到通过使用以编程方式处理代码的技术可以实现什么。 我认为这些技术不是很广为人知或使用,这很遗憾,因为它们可能非常有用。 谁知道,即使您不想使用Spoon甚…

PDH-SDH光端机指示灯具体含义介绍

最近有很多客户朋友来咨询有关PDH/SDH光端机各个指示灯含义的问题,其实在很多故障发生的时候我们都可以通过光端机各个指示灯的状态来分析故障问题,从而帮助解决问题。接下来我们就来为大家详细介绍一下PDH/SDH光端机指示灯的具体含义,感兴趣…

【渝粤教育】21秋期末考试工程项目管理10324k2

1、()是项目投产前由建设单位进行的一项重要工作,是在完成建设阶段任务以后转入到建筑产品的生产以及产品经营的必要条件 (2.5 分) A.可行性研究 B.资金筹备 C.招标 D.生产准备 2、基础设施工程…

【渝粤教育】21秋期末考试建设工程法规10221k1

1、当事人既约定违约金,又约定定金的,一方违约时,这两种违约责任(  )。(1 分) A.可合并使用 B.适用数值较小者 C.适用数值较大者 D.只能选择其一…

PDH光端机的主要作用以及特点有哪些?

在之前小编为大家介绍了光端机的详细分类,相信很多看过的朋友对pdh光端机这一块不陌生了吧,但是对于pdh光端机的作用以及特点你还了解吗,今天,飞畅科技的小编就来为大家详细介绍下pdh光端机的作用以及特点,感兴趣的朋友…

【渝粤教育】21秋期末考试服务标准化10011k1

1、采用国际及国外先进标准时,表示“等同采用”的代号是?(2 分) A.MOD B.NEQ C.ISO D.IDT 2、从命名规则上判断,GB/Z 30556.1-2017《电磁兼容 安装和减缓导则 一般要求》…

嵌入式开发环境构建_设计模式:不可变的嵌入式构建器

嵌入式开发环境构建上周,我写了关于什么使图案成为反图案。 本周,我提出一种设计模式…或等待……也许这是一种反模式。 还是? 让我们看看! 当有一个类可以构建另一个实例时,构建器模式是一种编程风格。 构建器模式的…

【渝粤教育】21秋期末考试财务管理10164k2

1、发放股票股利后,不会引起如下情形的有(   )。请在以下(1)-(4)中选出符合题意的全部选项:(1)改变股东的股权比例 ;(2)增加企业的资产&#xf…

python将html存为pdf_用Python将HTML转为PDF。

上期提到了如何获取公众号文章信息,这回就说下怎么将网页转为PDF,方便日常学习。html而后扩散一下以前一个比赛的结果(华章计算机抖音大赛)。数据库顺便谈谈本身对从此送书的一个想法。微信另外以前的送书活动,有中奖的读者没有联系我&#x…

SDH光端机和PDH光端机有什么区别?

通过之前的了解,我们都知道光端机有很多不同的分类,在这其中就有PDH光端机和SDH光端机,那么,PDH光端机和SDH光端机有什么区别?SDH光端机较PDH光端机相比有什么优势呢?接下来就由飞畅科技小编来为大家详细介…

【渝粤教育】国家开放大学2018年春季 0004-22T有机合成单元反应 参考试题

科目编号:0004 座位号: 2017-2018学年度第二学期期末考试 有机合成单元过程 2018年6月 一、选择题(每小题3分,共45分) 1.( )是可以再生的自然资源。 煤 B.农副产品 C.石油 D.天然气 下列有机化合物中的&a…

【渝粤教育】国家开放大学2018年春季 0034-22T现代管理原理 参考试题

科目编号:0034 现代管理原理 试题 2018年7月 单项选择:(每小题3分,共计30分) 1.下列各选项中,( )属于管理的对象。 A.组织资源和组织目标 B.组织资源和组织活动 C&…

使用Gradle – 2019版从Travis可靠发布到Maven Central

得益于在2018年和2019年末实现的显式登台存储库创建功能集,使您(自动)从Travis(不仅是)发布到Maven Central更加可靠。 背景 如果您仅想获取信息,如何使您的工件从Travis发布更可靠,请前进到另…

spring admin mysql_easyadmin: 简易的java后台管理框架,基于SpringBoot+FreeMark+ace admin+mysql...

easyadmin数据库一定要用utf8mb4编码,记得先执行manager.sql,再执行initdata.sql,其中tenant表不用管,这是我打算做的另外一个项目设计的表,因为直接复制的本项目,怕到时候忘记,所以没有删除拦截器相关文档…

【渝粤教育】国家开放大学2018年春季 0050-21T民族理论与民族政策 参考试题

科目编号:0050 座位号 2017-2018学年度第二学期期末考试 民族理论与民族政策 试题 2018年 7 月 一、单项选择题(在各题的备选答案中,只有1项是正确的,请将正确答案的序号,填写在题中的括号内。每小题2分,共…