玩JerseyTest(Jersey 2.5.1和DI)

我将尝试解释一个简单的REST示例。 这个想法是建立一个基本的架构来开始使用Jersey。 当我开始使用某些框架时,通常会开发一个快速失败的测试环境,这就是我要做的。

下一个示例具有以下功能:

  • 泽西岛2.5.1
  • 依赖注入
  • 用于测试的JUnit


类:

  • 资源:它将参加HTTP调用。
  • 服务:这是具有两个实现Impl1和Impl2的接口。
  • ServiceProvider:它将在运行时为每个请求调用提供适当的Service实现。
  • TestBinder:将绑定设置为Resource。
import static org.junit.Assert.assertEquals;import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Response;import org.glassfish.hk2.api.Factory;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.process.internal.RequestScoped;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Test;public class JerseyInjectionTest extends JerseyTest {private static final String EXPECTED_CONTENT = "any string :P";/*** Checks that the Resource uses Impl1.class*/@Testpublic void invokeImpl1(){invoke(Impl1.class);}/*** Checks that the Resource uses Impl2.class*/@Testpublic void invokeImpl2(){invoke(Impl2.class);}/*** Checks that Resource.anyContent has always the value of EXPECTED_CONTENT*/@Testpublic void checkContent(){Response response = target("example/content").request().get();assertEquals(EXPECTED_CONTENT, response.readEntity(String.class));}private <T extends Service> void invoke(Class<T> service){final String serviceName = service.getName();Response response = target("example/"+serviceName).request().get();assertEquals(service.getName(), response.readEntity(String.class));}/*** Register the Resource and TestBinder in the Application*/@Overrideprotected Application configure() {return new ResourceConfig() {{register(new TestBinder());register(Resource.class);}};}@Path("/example")public static class Resource {@InjectService service;@InjectString anyContent;/*** Returns the name of the Service's implementation*/@GET@Path("/{serviceClass}")public Response getDynamicInvokedService() {return Response.ok(service.getClass().getName()).build();}/*** Returns always the value of anyContent*/@GET@Path("/content")public Response getStaticContent() {return Response.ok(anyContent).build();}}/*** This class will help Resource to set the @Inject fields.*/public static class TestBinder extends AbstractBinder{@Overrideprotected void configure() {bindFactory(ServiceProvider.class).to(Service.class);bind(EXPECTED_CONTENT).to(String.class);}}/*** This class will instance a Services's implementation* per each time that the Resource is called.*/@RequestScopedpublic static class ServiceProvider implements Factory<Service> {private final String serviceName;public ServiceProvider(@PathParam("serviceClass") String serviceName) {this.serviceName = serviceName;}@Overridepublic void dispose(Service arg0) {}@Overridepublic Service provide() {try {return (Service) Class.forName(serviceName).newInstance();} catch (Exception e) {return null;}}}/*** Dummy services*/public static interface Service {}public static class Impl1 implements Service {}public static class Impl2 implements Service {}}

现在,我们可以轻松尝试新功能。

希望对您有所帮助。

参考:在TODOdev博客上与我们的JCG合作伙伴 Sergio Molina 一起使用JerseyTest(Jersey 2.5.1和DI) 。

翻译自: https://www.javacodegeeks.com/2014/01/playing-with-jerseytest-jersey-2-5-1-and-di.html

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

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

相关文章

MySQL之视图、触发器、事务、存储过程、函数

一. 视图 视图是一个虚拟表&#xff08;非真实存在&#xff09;&#xff0c;是跑到内存中的表&#xff0c;真实表是硬盘上的表&#xff0c;怎么就得到了虚拟表&#xff0c;就是你查询的结果&#xff0c;只不过之前我们查询出来的虚拟表&#xff0c;从内存中取出来显示在屏幕上…

php送数据找不到表,php – 数据源默认值中找不到的模型表

我正在创建一个cakephp 2.x应用程序.在开发过程中途,我突然发现自己有一个“找不到表”的错误.Missing Database TableError: Table blocked for model Parental was not found in datasource default.Notice: If you want to customize this error message, create project\Vi…

break、continue、return的区别

break、continue、return的区别 break&#xff1a;表示中断&#xff0c;可以在switch case中或循环中 使用 当遇到break 则结束当前整个switch case 或 循环 continue&#xff1a;表示继续&#xff0c;只能在循环中使用&#xff0c;当遇到continue时&#xff0c;则结束本次&…

原生JS封装ajax以及request

一、封装原生的xhr为ajax类 xhr以及用法见之前的文章1、根据url确定请求的头部以及别的信息。 var _headerConfig {};if(url.indexOf(getcaptcha) ! -1) {_headerConfig {Accept: image/png,responseType: arraybuffer,}} else if(url.indexOf(files/upload) ! -1) {_headerC…

Java 8 Friday Goodies:SQL ResultSet流

在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 &#xff0c;现在我们觉得是时候开始一个新的博客系列了…

java类型转换答案,在java中支持两种类型的类型转换,自动类型转换和强制类型转换。父类转化为子类需要强制转换。...

在java中支持两种类型的类型转换,自动类型转换和强制类型转换。父类转化为子类需要强制转换。更多相关问题计算机病毒通过()传染扩散得极快&#xff0c;危害最大。当一个现象的数量由小变大&#xff0c;另一个现象的数量相反地由大变小&#xff0c;这种相关称为()。输油管道沿线…

Java实现回形数,只利用数组、循环和if-else语句

import java.util.Scanner; public class learn {   public static void main(String[] args){ System.out.println("请输入你需要打印多少阶的回形数:");     Scanner scan new Scanner(System.in);     int num scan.nextInt();    // 接收num,则…

FWT(快速沃尔什变换)学习

https://www.cnblogs.com/cjyyb/p/9065615.html edo直接看大佬的博客吧 不仅有证明之类的还有板子呢 转载于:https://www.cnblogs.com/ENESAMA/p/10109995.html

创建一个简单的JAX-RS MessageBodyWriter

JAX-RS确实很酷&#xff0c;借助JAXB&#xff0c;只需添加带有JAXB批注的批注数据对象&#xff0c;即可为您转换许多响应数据类型。 我对JAXB相当陌生&#xff0c;但是一些简单的注释剪切/粘贴操作将带给您很长的路要走。 出于无法从JAX-RS资源方法返回该数据类型的目的&#…

SpringCloud学习笔记(6)----Spring Cloud Netflix之负载均衡-Ribbon的使用

1. 什么是负载均衡&#xff1f; 负载均衡&#xff0c;就是分发请求流量到不同的服务器。 负载均衡一般分为两种 1. 服务器端负载均衡&#xff08;nginx&#xff09; 2. 客户端负载均衡&#xff08;Ribbon&#xff09; 2. 服务提供者&#xff08;spring-cloud-provider&#xff…

pHp中文网零基础,零基础编程

基础编程conmysql_connect(constant("SERVER"),constant("USERNAME"),constant("PASSWORD"));if(!$this->con){die(connet to mysql error.mysql_error());}else{mysql_select_db(constant("DATABASE"),$this->con);}}function …

正确判断js数据类型 总结记录

正确判断js数据类型 总结记录 判断js中的数据类型有一下几种方法&#xff1a;typeof、instanceof、 constructor、 prototype、 三方库。 js六大数据类型 number&#xff1a; 数字&#xff0c;整数、浮点数等等&#xff0c; string&#xff1a; 单引号或者双引号来说明&…

wait/notify实现线程间的通信

使线程之间进行通信之后&#xff0c;系统间的交互性更加强大&#xff0c;在大大提高CPU利用率的同时还会使程序对各线程任务在处理的过程中进行有效的把控与监督。 1.不使用wait/notify实现线程间通信 使用sleep()while(true)也可以实现线程间通信。 例如:两个线程&#xff0c…

项目学生:使用AOP简化代码

这是Project Student的一部分。 许多人坚信方法应适合您的编辑器窗口&#xff08;例如20行&#xff09;&#xff0c;而有些人则认为方法应小于此范围。 这个想法是一种方法应该做一件事&#xff0c;而只能做一件事。 如果它做的还不止于此&#xff0c;则应将其分解为多种方法&…

洛谷 P3367 【模板】并查集

嗯... 题目链接&#xff1a;https://www.luogu.org/problemnew/show/P3367 并查集可以支持的操作&#xff1a;“并”和“查”。然后这道题主要就是考察这两种操作。将每一个点的“父亲”初始化为自己&#xff0c;然后分别进行“并”和“查”。 “并”&#xff1a;用递归函数fin…

MySQL使用学习使用,mysql学习--基本使用_MySQL

一旦安装完成&#xff0c;MySQL 服务器应该自动启动。sudo start mysql #手动的话这样启动sudo stop mysql #手动停止当你修改了配置文件后&#xff0c;你需要重启 mysqld 才能使这些修改生效。要想检查 mysqld 进程是否已经开启&#xff0c;可以使用下面的命令&#xff1a;pgr…

解决@vue/cli 创建项目是安装chromedriver时失败的问题

最近在使用新版vue的命令行工具创建项目时&#xff0c;安装chromedriver老是失败&#xff0c;导致后面的步骤也没有进行。网上搜索了一下&#xff0c;全是使用 npm install chromedriver --chromedriver_cdnurlhttp://cdn.npm.taobao.org/dist/chromedriver 安装的&#xff0c…

Java 8 Friday Goodies:Lambda和排序

在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 &#xff0c;现在我们觉得是时候开始一个新的博客系列了…

npm 包下载的各种姿势

最近在写Node程序的时候&#xff0c;突然对 npm install 的-save和-save-dev 这两个参数的使用比较混乱。其实博主在这之前对这两个参数的理解也是模糊的&#xff0c;各种查资料和实践后对它们之间的异同点略有理解。遂写下这篇文章避免自己忘记&#xff0c;同时也给node猿友一…

39.数组中数值和下标相等的元素

题目描述&#xff1a; 假设一个单调递增的数组里的每个元素都是整数且是唯一的&#xff0c;请编程实现一个函数&#xff0c;找出数组中任意一个数值等于其下标的元素&#xff0c;例如&#xff0c;在数组{-3&#xff0c;-1,1,3,5}中数字3和它的下标相同。 思路分析&#xff1a; …