网站维护页面怎么做的,网站内容建设要求 age06,遂宁市住房与城乡建设厅网站,中关村在线手机报价jersey 参数验证我最近加入了一个团队#xff0c;试图将一个完整的遗留系统转换为Java中的RESTful服务集。 他们决定将最新的2.x版本的Jersey用作REST容器#xff0c;这对我来说不是首选#xff0c;因为我不是JSR- *规范的忠实拥护者。 但是现在我必须承认#xff0c;JAX-R… jersey 参数验证 我最近加入了一个团队试图将一个完整的遗留系统转换为Java中的RESTful服务集。 他们决定将最新的2.x版本的Jersey用作REST容器这对我来说不是首选因为我不是JSR- *规范的忠实拥护者。 但是现在我必须承认JAX-RS 2.x的运行正确需要几乎零的样板代码支持功能的自动发现并且像其他现代框架一样更喜欢使用约定而不是配置。 由于该规范还很年轻因此很难找到具有一些可用代码的优秀教程和启动项目。 我在GitHub上创建了jersey2-starter项目该项目可用作您自己的生产就绪的RESTful服务的起点。 在本文中我将介绍如何实现和集成测试您自己的REST资源验证约束。 自定义约束 用Java编写REST时困扰我的问题之一是用注释乱扔您的类模型。 假设您要构建一个简单的Todo列表REST服务当使用Jacksonvalidation和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 ConstraintValidatorValidForCreation, 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 ConstraintValidatorValidForModification, 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.htmljersey 参数验证