input发送a.jax_与时俱进:在JAX-RS API中采用OpenAPI v3.0.0

input发送a.jax

看到时间流逝如此之快,真是太恐怖了! OpenAPI规范3.0.0是对Swagger规范的重大改进,大部分已于一年前发布,但工具赶上了一段时间。 但是,随着最近Swagger Core 2.0.0的正式发布,事情肯定会加速。

为了证明这一点,著名的JAX-RS 2.1实现Apache CXF是OpenAPI 3.0.0的最早采用者之一,在今天的帖子中,我们将了解一下JAX-RS 2.1 API可以多么容易从中受益。

与往常一样,为了使事情变得简单,我们将设计人员管理Web API,其中仅包含少量支持它的资源,这里没有什么太令人兴奋的。

POST   /api/people
GET    /api/people/{email}
GET    /api/people
DELETE /api/people/{email}

我们的模型将包含单个Person类。

public class Person {private String email;private String firstName;private String lastName;
}

为了增加一点魔力,我们将使用Spring Boot来使我们尽快启动并运行。 这样,让我们​​开始填充依赖项(假设我们使用Apache Maven进行构建管理)。

<dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-spring-boot-starter-jaxrs</artifactId><version>3.2.4</version>
</dependency>

在最新的3.2.x版本中, Apache CXF基于Swagger Core 2.0.0引入了一个专用于OpenAPI 3.0.0的新模块cxf-rt-rs-service-description-openapi-v3

<dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-rs-service-description-openapi-v3</artifactId><version>3.2.4</version>
</dependency><dependency><groupId>org.webjars</groupId><artifactId>swagger-ui</artifactId><version>3.13.6</version>
</dependency>

Swagger UI并不是必须存在的,但这是探索API的非常有用和漂亮的工具(如果在classpath中可用, Apache CXF会将其无缝集成到您的应用程序中,我们将在稍后介绍) 。

前提条件就位,让我们做一些编码! 在开始之前,值得注意的是Swagger Core 2.0.0有很多方法可以为您的服务填充OpenAPI 3.0.0定义,包括属性文件,注释或以编程方式。 在这篇文章中,我们将仅使用注释。

@OpenAPIDefinition(info = @Info(title = "People Management API",version = "0.0.1-SNAPSHOT",license = @License(name = "Apache 2.0 License",url = "http://www.apache.org/licenses/LICENSE-2.0.html"))
)
@ApplicationPath("api")
public class JaxRsApiApplication extends Application {
}

看起来非常简单, @ OpenAPIDefinition为我们所有的Web API设置了顶级定义。 移动到PeopleRestService,我们只需添加@Tag注释,那么,标签我们的API。

@Path( "/people" ) 
@Tag(name = "people")
public class PeopleRestService {// ...
}

太棒了,到目前为止没有什么复杂的。 最棘手的部分从Web API操作定义开始,因此让我们看一下第一个示例,即获取所有人的操作。

@Produces(MediaType.APPLICATION_JSON)
@GET
@Operation(description = "List all people", responses = {@ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Person.class))),responseCode = "200")}
)
public Collection<Person> getPeople() {// ...
}

相当多的注释,但总的来说,看起来很干净直接。 让我们看一下另一个,即通过其电子邮件地址查找此人的端点。

@Produces(MediaType.APPLICATION_JSON)
@Path("/{email}")
@GET
@Operation(description = "Find person by e-mail", responses = {@ApiResponse(content = @Content(schema = @Schema(implementation = Person.class)), responseCode = "200"),@ApiResponse(responseCode = "404", description = "Person with such e-mail doesn't exists")}
)
public Person findPerson(@Parameter(description = "E-Mail address to lookup for", required = true) @PathParam("email") final String email) {// ...
}

同样,通过电子邮件删除该人的操作看起来几乎是相同的。

@Path("/{email}")
@DELETE
@Operation(description = "Delete existing person",responses = {@ApiResponse(responseCode = "204",description = "Person has been deleted"),@ApiResponse(responseCode = "404", description = "Person with such e-mail doesn't exists")}
)
public Response deletePerson(@Parameter(description = "E-Mail address to lookup for", required = true ) @PathParam("email") final String email) {// ...
}

太好了,让我们总结一下最后一个可以说是最有趣的端点,它增加了一个新人(使用@FormParam的选择纯粹是为了说明API的不同风格)。

@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.APPLICATION_JSON)
@POST
@Operation(description = "Create new person",responses = {@ApiResponse(content = @Content(schema = @Schema(implementation = Person.class), mediaType = MediaType.APPLICATION_JSON),headers = @Header(name = "Location"),responseCode = "201"),@ApiResponse(responseCode = "409", description = "Person with such e-mail already exists")}
)
public Response addPerson(@Context final UriInfo uriInfo,@Parameter(description = "E-Mail", required = true) @FormParam("email") final String email, @Parameter(description = "First Name", required = true) @FormParam("firstName") final String firstName, @Parameter(description = "Last Name", required = true) @FormParam("lastName") final String lastName) {// ...
}

如果您有使用较旧的Swagger规范记录Web API的经验,则可能会发现该方法非常熟悉,但比较冗长(或者更确切地说是形式化的)。 这是规范领导和社区所做的巨大工作的结果,以使其尽可能完整和可扩展。

已定义和记录了API,现在该尝试一下了! 不过,缺少的部分是Spring配置,在该配置中我们将初始化并公开我们的JAX-RS Web服务。

@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackageClasses = PeopleRestService.class)
public class AppConfig {@Autowired private PeopleRestService peopleRestService;@Bean(destroyMethod = "destroy")public Server jaxRsServer(Bus bus) {final JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();factory.setApplication(new JaxRsApiApplication());factory.setServiceBean(peopleRestService);factory.setProvider(new JacksonJsonProvider());factory.setFeatures(Arrays.asList(new OpenApiFeature()));factory.setBus(bus);factory.setAddress("/");return factory.create();}@Beanpublic ServletRegistrationBean cxfServlet() {final ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new CXFServlet(), "/api/*");servletRegistrationBean.setLoadOnStartup(1);return servletRegistrationBean;}
}

OpenApiFeature是这里的关键要素,它负责所有集成和自省。 Spring Boot应用程序是完成图片的最后一步。

@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(AppConfig.class, args);}
}

让我们立即构建并运行它:

mvn clean package 
java -jar target/jax-rs-2.1-openapi-0.0.1-SNAPSHOT.jar

启动应用程序后,我们的Web API的OpenAPI 3.0.0规范应处于活动状态,并可以JSON格式用于以下位置:

http://localhost:8080/api/openapi.json

或使用YAML格式:

http://localhost:8080/api/openapi.json

探索并使用我们的Web API会很棒吗? 由于我们包含了Swagger UI依赖关系,因此不必理会,只需导航到http:// localhost:8080 / api / api-docs?url = / api / openapi.json :

特别要注意的是,小图标Swagger UI会与您的API版本一起放置,以暗示其符合OpenAPI 3.0.0规范。

这里只需要注意,使用Spring Boot没有什么特别的。 如果您在OSGi容器中使用Apache CXF (例如,例如Apache Karaf ),则还可以与OpenAPI 3.0.0集成(如果您对此主题感兴趣,请查阅官方文档和示例 )。

一切看起来都很简单,但是如何从Swagger规范的旧版本迁移到OpenAPI 3.0.0 ? Apache CXF具有强大的功能, 可以即时转换较旧的规范,但总的来说, OpenApi.Tools门户是评估选项的正确位置。

您应该迁移到OpenAPI 3.0.0吗? 老实说,我相信您应该,至少应该尝试进行试验,但是请注意,该工具还不够成熟,请期盼一些障碍(您可以通过提供补丁来克服这些障碍) )。 但是无疑,前程似锦!

完整的项目资源可在Github上找到 。

翻译自: https://www.javacodegeeks.com/2018/05/moving-with-the-times-towards-openapi-v3-0-0-adoption-in-jax-rs-apis.html

input发送a.jax

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

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

相关文章

display和show的区别

一、词义不同 1、display &#xff1a;展览&#xff0c;陈列&#xff1b;陈列品&#xff0c;展览品&#xff1b;显示器&#xff1b;炫耀。 例句&#xff1a;It was an incredibledisplayof motherly love and forgiveness. 那是慈母般关爱与宽容的了不起的表现。 2、show&am…

人类一败涂地邀请好友一直显示连接服务器,人类一败涂地怎么邀请好友 局域网创建房间方法图文教学-游侠网...

人类一败涂地怎么邀请好友?想要邀请好友&#xff0c;就要先创建房间&#xff0c;有些玩家不知道具体的操作&#xff0c;这里给大家带来了“主播北北”提供的人类一败涂地局域网创建房间方法图文教学&#xff0c;一起学习下吧。局域网创建房间方法图文教学按照下列步骤操作操作…

将json绑定为对象_了解自定义对象创建:JSON绑定概述系列

将json绑定为对象让我们看一下JSON绑定如何处理自定义对象的创建。 本系列的下一篇文章将介绍如何使用适配器自定义JSON-B。 JSON-B期望所有类都有一个公共的无参数构造函数 &#xff0c;在反序列化过程中使用它来实例化目标类。 创建实例后&#xff0c;可通过调用适当的sett…

什么是迭代

迭代是重复反馈过程的活动&#xff0c;其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”&#xff0c;而每一次迭代得到的结果会作为下一次迭代的初始值。 重复执行一系列运算步骤&#xff0c;从前面的量依次求出后面的量的过程。此过程的每一次结果&a…

sum服务器操作系统,SUM服务器监控软件

SUM服务器监控软件是服务器监控软件中最为流行的一种企业级监控软件系统&#xff0c;它具有功能强大、监控计数器齐全、完全可配置可管理、集中的监控软件、良好的可扩展性。它除了为企业单位提供IT系统(服务器、网络设备等)的基础监控外&#xff0c;还为企业提供运行在这些基础…

jpa批量保存,事务没提交_在事务外自动保存托管JPA实体

jpa批量保存,事务没提交Spring中的存储库和事务并存。 Spring中的所有数据库访问都应在事务内运行&#xff0c;并且通常在某个地方使用Transactional来强制执行此操作。 但是&#xff0c;这并不总是必需的。 例如&#xff0c;当使用Spring Data时&#xff0c;您的存储库使用Sim…

sum和total的区别

文章目录一、词义辨析不一样二、词义广泛性不一样三、变形词不一样一、词义辨析不一样 1、sum指两个或更多的数目相加的总和。 例&#xff1a;When you add all the figures together, the sum is100. 当你把这些数字加起来&#xff0c;总数是100。 2、total指总量之大&…

速达服务器账套定期维护么,速达软件常见操作问题解决方法

《速达软件常见操作问题解决方法》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《速达软件常见操作问题解决方法(11页珍藏版)》请在人人文库网上搜索。1、速达软件常见操作问题解决方法,速达软件 ,1,打开客户端登陆时“你输入的数值不规范&#xff0c;请输入整数&…

IntelliJ IDEA for Mac在MacOS模式下的导航快捷键(Navigation Shortcut)

快捷键快捷键符号英文名称功能说明Shift Command [⇧⌘[Go to previous editor tab/Select Previous Tab向左切换打开的编辑 tab 页Shift Command ]⇧⌘[Go to next editor tab/Select Next Tab向右切换打开的编辑 tab 页F12Go back to previous tool window返回到前一个工…

redis streams_初步了解Redis Streams以及如何在Java中使用它们

redis streams自今年年初以来&#xff0c;Redis Streams已进入Redis的unstable分支&#xff0c;并且第一个客户开始采用Redis Streams API。 因此&#xff0c;这是一个绝佳的时间&#xff0c;可以从客户端的角度看一下Redis Streams提供的功能以及如何使用它们。 免责声明&…

IntelliJ IDEA for Mac 在MacOS模式的重构快捷键(Refactoring Shortcut)

快捷键快捷键符号英文名称功能说明F5Copy复制文件到指定目录F6Move移动文件到指定目录Command Delete⌘⌫Safe Delete安全删除ShiftF6⇧F6Rename重命名&#xff0c;批量修改相同引用变量的名称。例如&#xff0c;变量 i &#xff0c;在代码中多个地方有使用到&#xff0c;那么…

java中无法推断类型参数_Java 10中的本地类型推断,或者如果它像鸭子一样嘎嘎叫...

java中无法推断类型参数最近&#xff0c;Oracle采用了一种新策略&#xff0c;即每六个月发布一次新的语言版本。 该策略假定只有每个第3版都将提供长期支持或LTS。 快速说明&#xff1a; 具有LTS的当前版本是Java 8&#xff1b; Java 9仅应在2018年3月之前获得支持&#xff0…

搭建IC设计EDA虚拟机服务器,忆往昔--集成门控时钟技术的前世--分离门控时钟技术...

本文转自&#xff1a;自己的微信公众号《集成电路设计及EDA教程》《忆往昔--集成门控时钟技术的前世--分离门控时钟技术》多种门控时钟实现方案&#xff1a;Design Compiler中已经集成了可以进行低功耗设计的Power Compiler&#xff0c;它有多种门控时钟实现方案(分离门控时钟、…

IntelliJ IDEA for Mac 在MacOS模式下的注释快捷键(Comment Shortcut)

快捷键快捷键符号英文名称功能说明Command/⌘/Comment/uncomment with line comment单行注释Command Option /⌘⌥/Comment/uncomment with block comment块注释&#xff0c;多行注释Shift Control /⇧⌃/Comment/uncomment with block comment块注释&#xff0c;多行注释/…

云服务器的协议,云服务器协议

云服务器协议 内容精选换一换当创建文件系统后&#xff0c;您需要使用云服务器来挂载该文件系统&#xff0c;以实现多个云服务器共享使用文件系统的目的。本章节以Windows 2012版本操作系统为例进行CIFS类型的文件系统的挂载。同一SFS容量型文件系统不能同时支持NFS协议和CIFS协…

java 类名重复_更快地重复访问Java的Java类名?

java 类名重复Claes Redestad已在core-libs-dev邮件列表上发布了消息“ RRF&#xff1a;8187123 &#xff1a;&#xff08;反映&#xff09;Class&#xff03;getCanonicalName和Class&#xff03;getSimpleName是性能问题的一部分 ”&#xff0c;他在邮件列表中要求审查建议的…

IntelliJ IDEA for Mac在MacOS模式下的编辑快捷键(Editing Shortcut)

快捷键快捷键符号英文名称功能说明Control Space⌃SpaceBasic code completion基本的代码补全&#xff08;补全任何类、方法、变量&#xff09;&#xff0c;代码智能提示&#xff0c;因为和切换输入法快捷键冲突&#xff0c;所以基本改成Alt/Shift Command Enter⌘⇧↩Compl…

网站服务器被访问 io,服务器端被客户端访问完以后出现java.io.ioexception,socket问题。...

异常为&#xff1a;java.io.ioexception客户端代码如下&#xff1a;package package1.socket;import java.net.*;import java.io.*;import java.util.*;public class C_Scoket {Socket C_S;BufferedReader br;PrintWriter pw;String receive;public static void main(String[] …

layui绑定json_认识定制:JSON绑定概述系列

layui绑定json让我们看一下自定义JSON绑定序列化和反序列化过程时 &#xff0c; 注释模型和运行时配置如何工作。 本系列的下一篇文章介绍JSON-B如何处理自定义对象的创建。 注释方法 使用注释方法&#xff0c;可以通过注释字段&#xff0c;JavaBean方法和类来定制默认的序列…

IntelliJ IDEA for Mac在MacOS模式下的调试快捷键(Debugging Shortcut)

快捷键快捷键符号英文名称功能说明F8F8Step Over进入下一步&#xff0c;如果当前行断点是一个方法&#xff0c;不会进入当前方法体内。逐行执行程序F7F7Step Into进入下一步&#xff0c;如果当前行断点是一个方法&#xff0c;则进入当前方法体内&#xff0c;如果该方法体还有方…