jersey 参数验证_在Jersey 2中进行集成测试自定义验证约束

jersey 参数验证

我最近加入了一个团队,试图将一个完整的遗留系统转换为Java中的RESTful服务集。 他们决定将最新的2.x版本的Jersey用作REST容器,这对我来说不是首选,因为我不是JSR- *规范的忠实拥护者。 但是现在我必须承认,JAX-RS 2.x的运行正确:需要几乎零的样板代码,支持功能的自动发现,并且像其他现代框架一样,更喜欢使用约定而不是配置。 由于该规范还很年轻,因此很难找到具有一些可用代码的优秀教程和启动项目。 我在GitHub上创建了jersey2-starter项目,该项目可用作您自己的生产就绪的RESTful服务的起点。 在本文中,我将介绍如何实现和集成测试您自己的REST资源验证约束。

自定义约束

用Java编写REST时困扰我的问题之一是用注释乱扔您的类模型。 假设您要构建一个简单的Todo列表REST服务,当使用Jackson,validation和Spring Data时,您可以轻松地将其作为实体类结束:

@Document
public class Todo {private Long id;@NotNullprivate String description;@NotNullprivate Boolean completed;@NotNullprivate DateTime dueDate;@JsonCreatorpublic Todo(@JsonProperty("description") String description, @JsonProperty("dueDate") DateTime dueDate) {this.description = description;this.dueDate = dueDate;this.completed = false;}// getters and setters
}

您的域模型现在几乎在所有地方都被混乱的注释有效地模糊了。 让我们看看如何使用验证约束( @NotNull )。 有人可能会说您可以引入一些具有自己的验证规则的DTO层,但是这与纯REST API设计对我来说是冲突的,后者表示您在应映射到您的域类的资源上进行操作。 另一方面– Todo对象有效是什么意思? 创建Todo ,应提供说明和截止日期,但是更新时会怎样? 您应该能够更改描述,到期日(推迟)和完成标志(标记为完成)中的任何一个,但是您至少应提供其中之一作为有效的修改。 因此,我的想法是引入自定义验证约束,这些约束用于创建和修改:

@Target({TYPE, PARAMETER})
@Retention(RUNTIME)
@Constraint(validatedBy = ValidForCreation.Validator.class)
public @interface ValidForCreation {//...class Validator implements ConstraintValidator<ValidForCreation, Todo> {/...@Overridepublic boolean isValid(Todo todo, ConstraintValidatorContext constraintValidatorContext) {return todo != null&& todo.getId() == null&& todo.getDescription() != null&& todo.getDueDate() != null;}}
}@Target({TYPE, PARAMETER})
@Retention(RUNTIME)
@Constraint(validatedBy = ValidForModification.Validator.class)
public @interface ValidForModification {//...class Validator implements ConstraintValidator<ValidForModification, Todo> {/...@Overridepublic boolean isValid(Todo todo, ConstraintValidatorContext constraintValidatorContext) {return todo != null&& todo.getId() == null&& (todo.getDescription() != null || todo.getDueDate() != null || todo.isCompleted() != null);}}
}

现在,您可以将验证注释移至REST端点的定义:

@POST
@Consumes(APPLICATION_JSON)
public Response create(@ValidForCreation Todo todo) {...}@PUT
@Consumes(APPLICATION_JSON)
public Response update(@ValidForModification Todo todo) {...}

现在,您可以从模型中删除那些NotNull

整合测试

集成测试通常有两种方法:

  • 测试是在与应用程序不同的JVM上运行的,而该应用程序则部署在其他集成环境中
  • 测试在设置块中以编程方式部署应用程序。

两者都有其优点和缺点,但是对于足够小的服务,我个人更喜欢第二种方法。 设置起来非常容易,并且您只启动了一个JVM,这使得调试非常容易。 您可以使用Arquillian之类的通用框架在容器环境中启动应用程序,但是我更喜欢简单的解决方案,而只是使用嵌入式Jetty。 为了使测试设置与100%的生产相当,我正在创建完整的Jetty的WebAppContext并且必须解决所有运行时相关性,才能使Jersey自动发现正常工作。 这可以通过Arrinklian子项目Shrinkwrap解决的Maven 轻松实现:

WebAppContext webAppContext = new WebAppContext();webAppContext.setResourceBase("src/main/webapp");webAppContext.setContextPath("/");File[] mavenLibs = Maven.resolver().loadPomFromFile("pom.xml").importCompileAndRuntimeDependencies().resolve().withTransitivity().asFile();for (File file: mavenLibs) {webAppContext.getMetaData().addWebInfJar(new FileResource(file.toURI()));}webAppContext.getMetaData().addContainerResource(new FileResource(new File("./target/classes").toURI()));webAppContext.setConfigurations(new Configuration[] {new AnnotationConfiguration(),new WebXmlConfiguration(),new WebInfConfiguration()});server.setHandler(webAppContext);

( 此Stackoverflow线程在这里启发了我很多)

现在是该文章最后一部分的时候了:参数化我们的集成测试。 由于我们要测试验证约束,因此有许多要检查的边缘路径(并使您的代码覆盖率接近100%)。 每个案例编写一个测试可能是一个坏主意。 在实用的JUnit解决方案中,我最相信实用主义者团队的Junit Params 。 它非常简单,并且具有用于创建提供程序的类似于JQuery的帮助程序的概念。 这是我的测试代码(我也在这里使用构建器模式来创建各种Todos):

@Test
@Parameters(method = "provideInvalidTodosForCreation")
public void shouldRejectInvalidTodoWhenCreate(Todo todo) {Response response = createTarget().request().post(Entity.json(todo));assertThat(response.getStatus()).isEqualTo(BAD_REQUEST.getStatusCode());
}private static Object[] provideInvalidTodosForCreation() {return $(new TodoBuilder().withDescription("test").build(),new TodoBuilder().withDueDate(DateTime.now()).build(),new TodoBuilder().withId(123L).build(),new TodoBuilder().build());
}

OK,足够的阅读知识,随时可以克隆项目并开始编写REST服务!

参考: 在我们的JCG合作伙伴 Piotr Jagielski的“ 全栈JVM开发”博客中, 在Jersey 2中集成测试自定义验证约束 。

翻译自: https://www.javacodegeeks.com/2014/03/integration-testing-custom-validation-constraints-in-jersey-2.html

jersey 参数验证

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

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

相关文章

工业交换机厂家有哪些?工业交换机十大品牌供应商!

对于交换机这一块有所了解的朋友&#xff0c;想必对于工业交换机这一块一定不会陌生吧&#xff0c;工业交换机是我们在重新组建互联网中一个非常重要的电子通信设备&#xff0c;起着很重要的网络桥接作用&#xff0c;在工业上发挥着极大的作用。我们都知道&#xff0c;工业交换…

基于光学传感器技术的光学测量仪对汽车行业的影响

光学传感器技术的创新供应商NextSense GmbH在斯图加特2013贸易展览会上展示CALIPRI技术称为非接触式多平台方法&#xff0c;用于快速记录和灵活分析间隙轮廓。“CALIPRI技术满足汽车行业对更窄间隙尺寸和独立于平台的测量解决方案的需求&#xff0c;光学测量系统可以测量迄今为…

[渝粤教育] 四川信息职业技术学院 Linux网络管理 参考 资料

教育 -Linux网络管理-章节资料考试资料-四川信息职业技术学院【】 任务一 配置静态地址 1、【单选题】在centOS7中对网络的配置&#xff0c;是基于会话(connection)的&#xff0c;一个网卡对应的会话可以有&#xff08; &#xff09; A、一个 B、两个 C、三个 D、多个 参考资料…

为特使建立控制平面的指南第2部分-识别组件

这是探索为Envoy Proxy构建控制平面的系列文章的第2部分。 在本博客系列中&#xff0c;我们将研究以下领域&#xff1a; 采用一种机制来动态更新Envoy的路由&#xff0c;服务发现和其他配置 确定哪些组件构成了控制平面&#xff0c;包括后备存储&#xff0c;服务发现API&…

无线通信模块定点传输-点对多点的具体传输应用

1. 无线模块通信传输发展背景 在物联网无线通信传输应用中&#xff0c;同一环境中往往具有多个无线通信模块在使用&#xff0c;由于射频本身的特性影响&#xff0c;导致无线模块相互传输过程中很容易造成干扰。干扰是由于同一个环境中使用了多对无线模块同时发射造成的。在多…

飞畅科技-工业交换机电源故障初探

众所周知&#xff0c;工业以太网交换机由于其特定的工业应用场合&#xff0c;我们在使用过程中难免会发生这样或那样的故障&#xff0c;但纵观来看这些故障还是有一定规律可循&#xff0c;比如电源故障就占其中很大一部分比重。工作中常遇到各种各样的电源故障问题&#xff0c;…

[渝粤教育] 四川大学 简明大学化学·物质结构部分入门 参考 资料

教育 -简明大学化学物质结构部分入门-章节资料考试资料-四川大学【】 微观粒子的运动特性 1、【单选题】首先对原子结构提出含核模型的科学家是&#xff08;&#xff09; A、汤姆生(Thomson)&#xff1b; B、卢瑟福(Rutherford)&#xff1b; C、莫塞莱(Mosely)&#xff1b; D、…

无线模块透明传输技术的物联网应用案例

近年来&#xff0c;随着射频技术、集成电路、自动控制、无线数据通讯技术的迅速发展&#xff0c;无线传输技术越来越多的被提及&#xff0c;当前的智慧城市、智慧农业、智慧工厂等都需要无线传输技术来支撑。以下主要介绍几种点对多点的无线通信模块具体应用&#xff1a; 一、…

飞畅科技-工业交换机防雷知识总结

工业级交换机的防雷不能偏重任何一方&#xff0c;偏重哪一方的防雷只能称为局部防雷&#xff0c;而局部防雷带有“先天不足”问题。所以工业级交换机防雷应综合进行防雷防范。那么&#xff0c;工业交换机防雷需要注意哪些问题呢&#xff1f;接下来就由飞畅科技的小编一起来为大…

[渝粤教育] 天水师范学院 宇宙探秘 参考 资料

教育 -宇宙探秘-章节资料考试资料-天水师范学院【】 第二章 星系 1、【单选题】大爆炸之后50万年的宇宙和现在的临近宇宙&#xff0c;气体&#xff08;氢&#xff09;分别是以什么形式存在的&#xff1f; A、中性&#xff0c;中性 B、中性&#xff0c;电离 C、电离&#xff0c;…

BLE蓝牙模块NRF518/NRF281/NRF528/NRF284芯片方案对比

&#xfeff;1&#xff0e;nRF51822简介 nRF51822是一款功能强大&#xff0c;高度灵活的多协议的SoC&#xff0c;非常适用于低功耗蓝牙模块和2.4GHz的无线应用。该SoC是基于ARM Cortex M0为内核的微处理器&#xff0c;拥有256KB/128KB的片上FLASH存储空间&#xff0c;32KB/16K…

[渝粤教育] 天津师范大学 基础心理学 参考 资料

教育 -基础心理学-章节资料考试资料-天津师范大学【】 第一章 绪论单元测验 1、【单选题】心理过程是人脑能动地反映客观事物的过程&#xff0c;它包括&#xff08; &#xff09; A、认知、情感、行为 B、感觉、知觉、行为 C、情感、意志、行为 D、认知、情感、意志 参考资料【…

几步看懂晶闸管的结构和工作原理

之前小亿有讲解过二极管和三极管的内容&#xff0c;感兴趣的朋友可以去网站主页搜索&#xff0c;今天我们来了解晶闸管。 晶闸管结构 单向晶闸管&#xff08;晶体闸流管&#xff09;是N-P-N-P四层半导体结构&#xff0c;中间形成了三个PN结。有三个电极&#xff0c;分别是阳极…

工业交换机和工业路由器的区别

现如今&#xff0c;随着时代的进步&#xff0c;互联网已成为人们生活中不可或缺的一部分&#xff0c;通常由许多不同类型的计算机网络相互连接而成。如果几个计算机网络在物理上连接在一起,它们之间并不能进行沟通,那么这种“互连”没有实际意义。所以在谈到“互连”时,就已经暗…

[渝粤教育] 宁波财经学院 财务管理 参考 资料

教育 -财务管理-引进-章节资料考试资料-宁波财经学院【】 财务管理目标 1、【单选题】相对于每股利润最大化目标而言&#xff0c;企业价值最大化目标的不足之处是&#xff08;&#xff09;。 A、没有考虑资金的时间价值 B、没有考虑投资的风险价值 C、不能反映企业潜在的获利能…

javase获取项目根目录_JavaSE:如何设置/获取您自己的文件和目录属性

javase获取项目根目录在上一篇文章“确定特定文件系统支持的视图”中 &#xff0c;了解如何询问文件系统存储&#xff0c;并了解特定文件属性视图的可支持性。 简而言之&#xff0c;我们将探索最高级和最重要的文件属性视图之一&#xff0c;即用户定义的文件属性视图 。 特别…

单片机遥控开关mos管

大家好&#xff0c;我是小亿。 说起MOS管&#xff0c;有些人的脑子里可能是一团浆糊&#xff0c;书上说的文字一大堆&#xff0c;今天小亿从物联网实用角度来介绍MOS管中最常用的NMOS&#xff0c;让你做到举一反三。 首先来看图&#xff0c;我们可以用手通过控制开关来实现对灯…

[渝粤教育] 山东职业学院 话说铁道 参考 资料

教育 -话说铁道-章节资料考试资料-山东职业学院【】 随堂测验 1、【单选题】铁路站段是按&#xff08; &#xff09;进行专业设置&#xff0c;是直接进行最基本的运输产生活动的生产单位。 A、车、机、工、电、辆  B、机车、车辆、工务、电务 C、车、机、工、电、辆、供 D、铁…

什么是RS-485?

什么是RS485接口 RS-485接口也称为TIA-485(-A)或EIA-485接口&#xff0c;是一种定义UART串行通信系统中使用的驱动器和接收器的电气特性的标准。具有电信号平衡、支持多点系统的功能。该标准由电信行业协会和电子工业联盟&#xff08;TIA/EIA&#xff09;联合发布。实施RS485接…

飞畅科技-工业交换机接口类型介绍

工业交换机作为局域网节点连接的网络设备&#xff0c;它的接口类型是随着各种局域网和传输介质类型的发展而变化的&#xff0c;分析一下局域网的主要网络类型和传输介质发展过程&#xff0c;我们就不难发现各种工业交换机接口类型。接下来就由飞畅科技的小编来为大家详细介绍下…