背景
有一个系统比较老,由于低版本spring有一些安全漏洞,需要升级jdk和springboot版本。老的项目使用的jax-rs暴漏的api,一开始考虑切换为spring rest api,这样文档直接引用springdoc-openapi-starter-webmvc-ui就搞定了,但是由于种种原因,最终需要沿用jax-rs。 本文主要侧重说明springboot升级高版本后(jakarta.servlet),如何生成jax-rs/jersey接口swagger文档
相关框架版本
springboot 3.x ,jersey 3.x,openapi 3.x
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jersey</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>jakarta.ws.rs</groupId>
<artifactId>jakarta.ws.rs-api</artifactId>
<version>3.1.0</version>
</dependency>
swagger版本
2.2.22
引入swagger pom
由于springboot3.x版本使用的jakarta.servlet,所以引用如下包
<dependency>
<groupId>io.swagger.core.v3</groupId>
<artifactId>swagger-jaxrs2-jakarta</artifactId>
<version>2.2.22</version>
</dependency>
如果springboot是第版本,可以引用如下包
<dependency>
<groupId>io.swagger.core.v3</groupId>
<artifactId>swagger-jaxrs2</artifactId>
<version>2.2.7</version>
</dependency>
可以看下该包源码,关键点是io.swagger.v3.jaxrs2.integration.resources.OpenApiResource这个类,暴漏了openapi文档的访问入口
package io.swagger.v3.jaxrs2.integration.resources;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.servlet.ServletConfig;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Application;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.HttpHeaders;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.UriInfo;
@Path("/openapi.{type:json|yaml}")
public class OpenApiResource extends BaseOpenApiResource {
@Context
ServletConfig config;
@Context
Application app;
@GET
@Produces({MediaType.APPLICATION_JSON, "application/yaml"})
@Operation(hidden = true)
public Response getOpenApi(@Context HttpHeaders headers,
@Context UriInfo uriInfo,
@PathParam("type") String type) throws Exception {
return super.getOpenApi(headers, config, app, uriInfo, type);
}
}
其他类主要是根据配置的包生成swagger文档,其实是生成openapi.json文件。此处不展开说明了 io.swagger.v3.jaxrs2.integration.JaxrsApplicationAndResourcePackagesAnnotationScanner
配置接口包路径
在项目资源文件路径下新增openapi-configuration.yaml文件
resourcePackages:
- io.swagger.sample.resource 替换为自己项目接口包路径,swagger会扫描该路径生成文档
prettyPrint: true
cacheTTL: 0
openAPI:
info:
version: '1.0'
title: Swagger Pet Sample App Config File
description: 'This is a sample server Petstore server. You can find out more
about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net,
#swagger](http://swagger.io/irc/). For this sample, you can use the api key
`special-key` to test the authorization filters.'
termsOfService: http://swagger.io/terms/
contact:
email: apiteam@swagger.io
license:
name: Apache 2.0
url: http://www.apache.org/licenses/LICENSE-2.0.html
使swagger在项目中生效
将上面swagger暴漏的resource放到项目的上下文中,以jersey为例
public class MyApplication extends ResourceConfig {
public MyApplication() {
//下面两种方式二选一即可
//直接注册该类
register(io.swagger.v3.jaxrs2.integration.resources.OpenApiResource.class);
//或者通过扫包方式
packages("io.swagger.v3.jaxrs2.integration.resources")
}
}
通过上面三个步骤就可以访问接口的json文件了,访问链接为http://localhost:8080/自己的项目路径/openapi.json
如果未生成接口的json文件,可能是swagger注解问题(新老版本注解有替换),也可能是链接地址不对
swagger1.x & 2.x注解替换详情如下
@Api → @Tag
@ApiIgnore→@Parameter(hidden = true)或@Operation(hidden = true)或@Hidden
@ApiImplicitParam → @Parameter
@ApiImplicitParams → @Parameters
@Schema → @Schema
@SchemaProperty(hidden = true) → @Schema(accessMode = READ_ONLY)
@SchemaProperty → @Schema
@ApiOperation(value = "foo", notes = "bar") → @Operation(summary = "foo", description = "bar")
@ApiParam → @Parameter
@ApiResponse(code = 404+"", description = "foo") → @ApiResponse(responseCode = "404", description = "foo")
原文链接:https://blog.csdn.net/weixin_53618357/article/details/132672459
使用swagger-ui
以swagger-ui-dist方式举例
下载swagger-ui静态资源文件
将静态文件放到项目中,springboot 默认静态文件路径 classpath:/META-INF/resources/ classpath:/resources/ classpath:/static/ classpath:/public/
比如放到/resources/docs目录下
修改文档路径
修改swagger-initializer.js文件,替换url为上一步生成的openapi.json的访问路径
window.onload = function() {
//<editor-fold desc="Changeable Configuration Block">
// the following lines will be replaced by docker/configurator, when it runs in a docker-container
window.ui = SwaggerUIBundle({
url: "http://localhost:8080/我的项目路径/openapi.json",
dom_id: '#swagger-ui',
deepLinking: true,
presets: [
SwaggerUIBundle.presets.apis,
SwaggerUIStandalonePreset
],
plugins: [
SwaggerUIBundle.plugins.DownloadUrl
],
layout: "StandaloneLayout"
});
//</editor-fold>
};
配置项目静态文件访问
springboot中可以在application.properties文件中配置
# swagger static config
spring.mvc.static-path-pattern=/docs/**
# 项目静态资源的路径,会覆盖spring mvc默认的静态资源路径
spring.web.resources.static-locations=classpath:/docs
访问swagger ui
使用http://localhost:8080/我的项目路径/docs/index.html 访问swagger ui
到此,集成swagger文档结束,参考资料如下 github.com/swagger-api… github.com/swagger-api…