在 Spring MVC 应用程序中实现 Swagger 的“简单”方法

2023-11-29

我有一个用简单的 Spring 编写的 ReSTFul API(没有 Spring Boot,没有花哨的东西!)。我需要在其中实现 Swagger。到目前为止,互联网上的每个页面都让我抓狂,因为令人困惑的配置和臃肿的代码我根本找不到可移植性。

有谁有一个示例项目(或一组详细步骤)可以帮助我完成此任务?特别是,我正在寻找一个使用 swagger-springmvc 的好示例。我知道它有“样本”,但充其量,深奥的代码令人沮丧。

我必须澄清,我并不是在寻找“为什么 Swagger 是最好的”。我没有使用(并且对于我当前的任务也不会使用)Spring Boot 等。


Springfox(Swagger 规范 2.0,当前)

春狐已取代 Swagger-SpringMVC,现在支持 Swagger 规范 1.2 和 2.0。实现类已更改,允许进行更深入的自定义,但需要做一些工作。这文档已有所改进,但仍需要添加一些细节以进行高级配置。 1.2 实现的旧答案仍然可以在下面找到。

Maven 依赖

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.5.0</version>
</dependency> 

最低限度的实现看起来或多或少相同,但现在使用Docket类而不是SwaggerSpringMvcPlugin class:

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket api(){
        return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.any())
            .paths(PathSelectors.regex("/api/.*"))
            .build()
            .apiInfo(apiInfo());
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
            .title("TITLE")
            .description("DESCRIPTION")
            .version("VERSION")
            .termsOfServiceUrl("http://terms-of-services.url")
            .license("LICENSE")
            .licenseUrl("http://url-to-license.com")
            .build();
    }

}

您的 Swagger 2.0 API 文档现在可以在以下位置获取:http://myapp/v2/api-docs.

注意:如果您不使用 Spring boot,那么您应该添加 jackson-databind 依赖项。由于springfox使用jackson进行数据绑定。

现在添加 Swagger UI 支持变得更加容易。如果您使用 Maven,请为 Swagger UI webjar 添加以下依赖项:

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.5.0</version>
</dependency>

如果您使用 Spring Boot,那么您的 Web 应用程序应该自动选取必要的文件并在以下位置显示 UIhttp://myapp/swagger-ui.html(以前:http://myapp/springfox)。如果您不使用 Spring Boot,那么正如 yuriy-tumakha 在下面的答案中提到的那样,您将需要为文件注册一个资源处理程序。 Java 配置如下所示:

@Configuration
@EnableWebMvc
public class WebAppConfig extends WebMvcConfigurerAdapter {

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }

}

The new 静态文档生成功能看起来也很不错,虽然我自己还没有尝试过。

Swagger-SpringMVC(Swagger 规范 1.2,较旧)

的文档Swagger-SpringMVC可能有点令人困惑,但实际上设置起来非常容易。最简单的配置需要创建一个SpringSwaggerConfigbean 并启用基于注释的配置(您可能已经在 Spring MVC 项目中执行此操作):

<mvc:annotation-driven/>
<bean class="com.mangofactory.swagger.configuration.SpringSwaggerConfig" />

然而,我认为采取额外的步骤使用定义自定义 Swagger 配置是非常值得的SwaggerSpringMvcPlugin,而不是之前的 XML 定义的 bean:

@Configuration
@EnableSwagger
@EnableWebMvc
public class SwaggerConfig {

    private SpringSwaggerConfig springSwaggerConfig;

    @SuppressWarnings("SpringJavaAutowiringInspection")
    @Autowired
    public void setSpringSwaggerConfig(SpringSwaggerConfig springSwaggerConfig) {
        this.springSwaggerConfig = springSwaggerConfig;
    }

    @Bean
    public SwaggerSpringMvcPlugin customImplementation(){

        return new SwaggerSpringMvcPlugin(this.springSwaggerConfig)
                .apiInfo(apiInfo())
                .includePatterns(".*api.*"); // assuming the API lives at something like http://myapp/api
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
            .title("TITLE")
            .description("DESCRIPTION")
            .version("VERSION")
            .termsOfServiceUrl("http://terms-of-services.url")
            .license("LICENSE")
            .licenseUrl("http://url-to-license.com")
            .build();
    }

}

当您运行应用程序时,您现在应该会看到在以下位置创建的 API 规范http://myapp/api-docs。要设置精美的 Swagger UI,您需要从GitHub项目并将它们放入您的项目中。确保您的项目配置为提供静态 HTML 文件:

<mvc:resources mapping="*.html" location="/" />

然后编辑index.htmlSwagger UI 顶层的文件dist目录。在文件的顶部,您将看到一些引用api-docs另一个项目的 URL。编辑此内容以指向您项目的 Swagger 文档:

  if (url && url.length > 1) {
    url = url[1];
  } else {
    url = "http://myapp/api-docs";
  }

现在,当您导航到http://myapp/path/to/swagger/index.html,您应该会看到项目的 Swagger UI 实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Spring MVC 应用程序中实现 Swagger 的“简单”方法 的相关文章

随机推荐

  • Java 中的Character.getNumericValue(..) 对于大写和小写字符返回相同的数字

    我面前有一本书 其中包含以下代码片段 int a Character getNumericValue a int z Character getNumericValue z int A Character getNumericValue A
  • 尝试从 Thymeleaf Spring 视图调用方法时出错

    当我尝试从视图中调用方法时遇到问题 我的带有方法的 Java 类 public class FuncionesMuestroteca Bean public static boolean estoyMuestroteca boolean r
  • 有关在进程地址空间中加载 DLL 的问题

    嗯 我阅读了 Matt Pietrek 的几篇有关可移植可执行 PE 文件的文章 例如 深入研究 Win32 可移植可执行文件格式 Part 1 and Part 2 MSJ 关于链接器的文章 MSJ 关于 COFF 格式的文章 此外 我还
  • 确定范围内的经度和纬度

    我的数据库中有位置 位置具有纬度和经度属性 取自谷歌地图 例如 48 809591 是否有任何查询可以帮助我检索另一个位置范围内的位置 例子 我的位置 A 的纬度 48 809591 经度 2 124009 并且想要检索数据库中距离位置 A
  • 如何为 Arm/Raspberry Pi 交叉编译 libsndfile

    我正在尝试让一个可以在 Linux 下运行的交叉编译器 Debian squeeze amd64 但我似乎无法将我的文件与已安装的文件链接起来libsndfile 我假设我需要交叉编译源代码以针对 Raspberry Pi 并链接到该版本
  • isMail 和 isSMTP 有什么区别

    我正在使用 PHPMailer 但很难让 bluehost 上的 isSMTP 正常工作 我已经能够让 isMail 工作 并且想知道发送邮件有什么区别 另外 在尝试使用 isSMTP 时 我似乎收到 HELO 或身份验证错误 但 blue
  • 指定与 DotNetOpenID 一起使用的代理

    我正在使用 DotNetOpenID 为我们的网站提供信赖方 OpenID 支持 所有外部请求都必须通过代理服务器进行代理 我正在寻找一种方法来告诉 DotNetOpenID 使用此代理 我知道我可以在 web config 中设置全局代理
  • Swift 中数组下标的简写 setter 声明

    In my 最后一个问题 我问如何在 Swift 中为计算属性的下标编写 setter 我认为我的问题不够具体 无法理解 对于一项小任务来说 给出的答案要么不正确 要么很复杂 经过长时间的思考 我仍然认为也许一个更聪明的人可以提供更鼓舞人心
  • UIWebView 中自动播放视频

    您好 我有一个网络视图 当我尝试加载其中的视频文件时 它会自动开始播放视频 无需用户干预 并且播放按钮仍然显示在 web 视图中 视频正在其后面播放 我正在使用以下代码来加载 URL NSURL url NSURL fileURLWithP
  • 下载 Google Drive 中的公共文件 (Python)

    假设有人给了我一个链接 使我能够下载 Google 云端硬盘中的公共文件 我想编写一个可以读取链接然后将其下载为文本文件的程序 例如 https docs google com document d 1yJVXtabsP7KrJXSu3Xy
  • mySQL str_to_date() 函数返回错误

    当尝试使用 str to date 将 Estimates 表中的字符串日期值列 CreatedDate 转换为 mySQL 日期格式时 我不断收到错误消息 我的数据列包含 m d yy 格式的日期 例如 1 26 16 或 3 3 16
  • 如何通过母版页隐藏某些页面上的内容而不是其他页面上的内容?

    阅读这篇文章 但没有真正回答我的问题 并且有很多建议 所以不确定它们是否在正确的轨道上 针对asp页面的母版页内容过滤 我拥有的是一个带有 1 个母版页的网站 其中有一个所有页面都使用的全局页脚 我想仅删除一页 即登录页面 上的页脚 但保持
  • 由于 Mininet 中的身份验证错误,X11 连接被拒绝

    每当我从 mininet 中运行 xterm 时 我都会收到此消息 mininet gt xterm h1 mininet gt X11 connection rejected because of wrong authentication
  • 不使用任何数据结构查找两个集合的交集的算法

    我想知道在不使用任何外部数据结构 如哈希表 的情况下有效地确定两个相等元素 例如整数 数组的交集的算法 O nlogn 排序 然后使用迭代器对每个 element 数组进行迭代 if A iter1 gt B iter2 increase
  • 如果 Windows 资源管理器在特定路径打开,则不创建新实例

    我正在使用以下代码 以便当用户单击按钮时 会出现一个实例Windows资源管理器在特定路径上打开 但这会导致一个新的实例Explorer待打开 我想改变它 这样 如果Explorer如果已经在同一路径中打开 则程序不会创建新进程 而是将打开
  • 根据内容过滤Array中的字符串(过滤搜索值)

    我遇到了一个问题 我在 JS 中有一个类似的字符串数组 var myArray bedroomone bedroomonetwo bathroom 我想检索数组中包含关键字 bedroom 的所有元素 我怎样才能达到这样的结果 我尝试了不同
  • 快速加权散点矩阵计算

    六个月前在这个问题中 jez 很好地帮助我提出了行差异外积的快速近似 即 K np zeros len X len X for i Xi in enumerate X for j Xj in enumerate X dij Xi Xj K
  • 如何在 Python 2.5 中检查类相等性?

    我浏览了 Python 2 5 文档 但找不到答案 How do I check if an object is the same class as another object def IsClass obj1 obj2 return o
  • Java 可以在不改变活动窗口的情况下显示对话框吗?

    我想在上面显示一个模式 进度 对话框Frame 即使那样Frame不是活动窗口 但是 显示对话框会导致该对话框或其所有者成为活动窗口 有没有一种方法可以显示对话框而不使其或其所有者成为活动窗口 特别是在 Windows 平台上 我想这样做的
  • 在 Spring MVC 应用程序中实现 Swagger 的“简单”方法

    我有一个用简单的 Spring 编写的 ReSTFul API 没有 Spring Boot 没有花哨的东西 我需要在其中实现 Swagger 到目前为止 互联网上的每个页面都让我抓狂 因为令人困惑的配置和臃肿的代码我根本找不到可移植性 有