实施Jersey 2 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-Spring集成的源代码可在主Jersey源存储库中找到: 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

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

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

相关文章

Solidity中如何判断mapping中某个键是否为空呢?

Solidity中如何判断mapping中某个键是否为空呢? 一.比较标准的做法是建立一个专门和value相关的结构体,用一个布尔型变量来看是否这个key所对应的value被赋过值 代码如下: pragma solidity ^0.4.19;contract UserTest {struct User{string na…

Angular网络请求的封装

很多时候,我很喜欢angular的编码风格,特别是angular支持typescript之后,完整的生命周期,完美的钩子函数,都是别的语言所无法替代的。这里我来说说我自己的网络请求封装,某种意义上来说,angular自…

mac安装了多版本php 卸载,mac 安装多版本PHP

前言相信大家在mac 安装PHP多版本的时候也遇到了很多坑# brew install php56# brew install php70这样安装的话肯定会报错的,因为brew存在软连接这个时候我们第一步:brew unlink php56 或者 brew unlink php70这个步骤是关闭掉PHP的软连接第二步&#x…

新国标电动自行车目录库

浙江:https://xzsp.zjidb.com/api/bicycle 上海:http://www.shbicycle.com/info.asp 北京:http://wfcxjk1.bjjtgl.gov.cn/fjdcml/fjdcListM.jsp 安徽:http://ddch.aqi.ah.cn/index_GB17761-1999.asp 3C查询:http://ccc…

HTML | CSS | JavaScript 常见错误

持续更新 超链接鼠标悬浮后的状态 a:hover 拼写图片文件的路径问题转载于:https://www.cnblogs.com/lcchy/p/10139389.html

隐藏的东西? 您需要HiddenSidesPane

我的甘特图用户之一希望在屏幕上使用尽可能多的空间,并询问是否可以删除滚动条。 但是,如何在没有滚动条的情况下进行导航? 好的,有各种各样的键盘快捷键,当然还有FlexGanttFX支持的普通鼠标拖动,但是大多数…

jQuery的on绑定click和直接绑定click区别

状况之外 在之前的公司并没有遇到这个问题,也就没有深究。直到自己换了现在的公司,刚来第二天就开始写别人写到一半的项目,很无奈,不是原生就是jquery,由于项目急,已经来不及切换框架重新布局,只…

php教程哪个软件好,写php用哪款软件好?解决方法

写php用哪款软件好?现在用php-eclipse,但是感觉不太好用js、html、css的提示功能没有,要装插件,装了很久没装上。想问一下现在开发php哪款软件好大家指导一下,谢谢------解决方案--------------------如果要js、html、…

循环数组对象 php,PHP循环遍历stdClass对象的数组

我有一个在MySQL中运行的查询,它返回一个结果作为stdClass对象,如下所示:array(8){[0]>object(stdClass)#36(1){["color"]>string(7)"#a0a0a0"}[1]>object(stdClass)#35(1){["color"]>string(7)"#e0e0e0"}[2]&…

js实现复制粘贴功能

在项目中使用到复制粘贴功能,虽然网上有很多大牛封装了很多的插件,但是还是想不去使用插件,就像自己来实现这个功能。 初步想法: 1. 获取到需要复制的内容,这里我可以将需要复制的内容放在input或者textarea的value中&…

Thymeleaf与Spring集成(第1部分)

1.引言 本文重点介绍如何将Thymeleaf与Spring框架集成。 这将使我们的MVC Web应用程序能够利用Thymeleaf HTML5模板引擎,而不会丢失任何Spring功能。 数据层使用Spring Data与mongoDB数据库进行交互。 该示例包含在酒店的单页Web应用程序中,从中我们可以…

html注释快捷键

1.选中需要注释的内容--->ctrlshift/ 2.取消注释--->ctrlshift\ 转载于:https://www.cnblogs.com/wyhluckdog/p/10131898.html

Java中转发(Forward)和重定向(Redirect)的区别

从URL来说,转发的地址栏没有发生改变,而重定向则是新的URL从数据共享来说,转发可以共享request域里面的数据,而重定向则不能。效率来说转发效率高,重定向效率低转发一般用来登陆后转发到对应模块, 重定向一…

oracle 老白,老白学编程 - Netdata学习 - numa

Numa 介绍NUMA,即Non-Uniform Memory Access Architecture,非统一内存访问架构。背景传统的SMP中, 所有处理器共享系统总线,当cpu数目增大时, 系统总现竞争就相应增加,会成为系统的瓶颈,所以SMP系统的CPU数…

几个非常实用的JQuery代码片段

jQuery是一个兼容多浏览器的javascript库,核心理念是write less,do more(写得更少,做得更多)。jQuery使用户能更方便地处理HTML(标准通用标记语言下的一个应用)、events、实现动画效果,并且方便地为网站提供AJAX交互。jQuery还有一…

编码的喜悦……以及Java中的变异测试

多年以来,为源代码编写单元测试一直是一种好习惯。 并且还可以使用测试覆盖率报告来查看测试覆盖了多少代码。 尽管行分支覆盖率报告非常有用,但是它并不能告诉您单元测试的实际效果。 因此,甚至在测试中没有一个断言的情况下,甚至…

错误1083:配置成在该可执行程序中运行的这个服务不能执行该服务 【解决办法】...

一直好用的服务程序,今天遇到这个问题,搜了一下各位给出的解决办法; 1.程序里多添加serviceInstaller组件的,然而我并没改代码,也没重新编译,不是解决我问题的办法; 2.修改注册表的,…

oracle 更改启动内存,Oracle 11gR2修改内存参数后无法启动问题

Microsoft Windows [版本 6.1.7600]版权所有 (c) 2009 Microsoft Corporation。保留所有权利。C:\windows\system32>net start oracleserviceorclOracleServiceORCL 服务正在启动 ......OracleServiceORCL 服务已经启动成功。C:\windows\system32>sqlplus / as sysdbaSQL…

查看所有shell类型

[xfxuexi ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin /bin/tcsh /bin/csh 具体你使用的是那一个,取决于你的用户配置,可以在/etc/passwd文件查看最后一个字段 [xfxuexi ~]$ head -1 /etc/passwd…

Vue—事件修饰符

Vue事件修饰符 Vue.js 为 v-on 提供了事件修饰符来处理 DOM 事件细节&#xff0c;如&#xff1a; event.preventDefault() 或 event.stopPropagation()。Vue.js通过由点 (.) 表示的指令后缀来调用修饰符。 .stop.prevent.capture.self.once <!-- 阻止单击事件冒泡 -->…