首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在现有Spring应用程序中添加Swagger服务器存根

在现有Spring应用程序中添加Swagger服务器存根
EN

Stack Overflow用户
提问于 2016-04-20 03:26:12
回答 1查看 3.2K关注 0票数 13

Swagger Codegen生成的服务器存根插入现有Spring应用程序的最佳方法是什么?

我首先尝试使用petstore stubs示例。

我的Spring配置是用Java编写的,如下所示:

代码语言:javascript
运行
AI代码解释
复制
public class SpringConfigurationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { ApplicationContext.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { WebMvcContext.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

    // ... onStartup etc.

}

WebMvcConfigurationSupport:

代码语言:javascript
运行
AI代码解释
复制
@Configuration
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
@PropertySource({ "classpath:config.properties", "file:${CONFIGDIR}/config.properties" })
@ComponentScan(useDefaultFilters = false, basePackages = { "com.yyy", "com.xxx" }, includeFilters = { @Filter(type = FilterType.ANNOTATION, value = Controller.class) })
public class WebMvcContext extends WebMvcConfigurationSupport {

    // ... beans etc.
}

ApplicationContext:

代码语言:javascript
运行
AI代码解释
复制
@Configuration
@EnableAsync
@EnableScheduling
@EnableMBeanExport
@Import({SecurityConfig.class, GeneralDBConfiguration.class})
@ComponentScan(useDefaultFilters = true, basePackages = { "com.yyy", "com.xxx" }, excludeFilters = { @Filter(type = FilterType.ANNOTATION, value = {Controller.class, Configuration.class/*, Aspect.class*/}) })
public class ApplicationContext implements AsyncConfigurer {

    // beans etc.

}

如何将io.swagger.configuration包中的配置类部分包含到现有的应用程序中?

更多细节:

我遇到的问题之一是,如果我在petshop存根上指定maven依赖项(通过从mvn install:install-file ...目录在本地安装maven):

代码语言:javascript
运行
AI代码解释
复制
    <dependency>
        <groupId>io.swagger</groupId>
        <artifactId>swagger-spring-mvc-server</artifactId>
        <version>1.0.0</version>
    </dependency>

然后,我的spring应用程序找到了两个AbstractAnnotationConfigDispatcherServletInitializer(一个来自我的应用程序,一个来自io.swagger.configuration.WebApplication,一个来自swagger-spring-mvc-server),并且无法加载--给出了以下例外:

注册名为“dispatcher”的servlet失败。检查是否有另一个servlet在同一名称下注册。

我想另一种表达我的问题的方法是,如何使用swagger-codegen生成的服务器存根?看上去我不能只依靠盒子里的maven包.

EN

回答 1

Stack Overflow用户

发布于 2019-02-25 04:56:06

我可以看到,这是一个相当古老的,但我与此斗争了很多,我收集的信息可能对其他人有用,直到生成器文档得到改善。

本说明用于使用OpenApi生成器maven插件从openapi 3.0.0规范生成和使用spring服务器存根。

  1. 不要使用swagger-codegen,而是使用openapi生成器:https://github.com/OpenAPITools/openapi-generator (叉的推理在这里:https://github.com/OpenAPITools/openapi-generator/blob/master/docs/qna.md)
  2. 为服务器创建一个单独的项目/模块,并配置maven插件。
代码语言:javascript
运行
AI代码解释
复制
<build>
    <plugins>
        <plugin>
            <groupId>org.openapitools</groupId>
            <artifactId>openapi-generator-maven-plugin</artifactId>
            <version>3.3.4</version>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                    <configuration>
                        <skipIfSpecIsUnchanged>true</skipIfSpecIsUnchanged>
                        <inputSpec>${engine-openapi-spec.location}</inputSpec>
                        <output>${project.build.directory}/generated-sources/openapi</output>
                        <generatorName>spring</generatorName>
                        <library>spring-mvc</library>
                        <apiPackage>eu.dorsum.swift.engine.service.api</apiPackage>
                        <modelPackage>eu.dorsum.swift.engine.service.model</modelPackage>
                        <generateApis>true</generateApis>
                        <generateApiDocumentation>false</generateApiDocumentation>
                        <generateApiTests>false</generateApiTests>
                        <generateModels>true</generateModels>
                        <generateModelDocumentation>false</generateModelDocumentation>
                        <generateModelTests>false</generateModelTests>
                        <generateSupportingFiles>true</generateSupportingFiles>
                        <configOptions>
                            <sourceFolder>src/main/java</sourceFolder>
                            <java8>true</java8>
                            <dateLibrary>java8</dateLibrary>
                            <useTags>true</useTags>
                            <configPackage>eu.dorsum.swift.engine.appconfig</configPackage>
                            <interfaceOnly>false</interfaceOnly>
                            <delegatePattern>true</delegatePattern>
                        </configOptions>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

有两种配置是很难搞清楚的。

2.a:将configOptions/configPackage设置为应用程序根配置所在的包。此选项将将您的配置包作为附加的basePackage添加到OpenAPIUiConfiguration.java:@ComponentScan(basePackages = {"eu.dorsum.swift.engine.service.api", "eu.dorsum.swift.engine.appconfig"})中的组件扫描中。这是一种倒转的方法,最初您可能会通过让生成的mvc配置启动现有内容来实现,但这是我发现不需要修改生成代码的唯一方法。

2.b:将configOptions/delegatePattern设置为true。这个我很喜欢!这将生成一个额外的委托接口,您的服务器控制器可以实现这个接口。生成的ApiController将将所有服务调用委托给这个接口,因此您可以非常优雅地插入您的实现。在我的设置中,我有这样的链: MessageApi (generated ) -> MessageApiController实现MessageApi (generated控制器) -> MessageApiDelegate (generated ) -> MessageService实现MessageApiDelegate (my implements )。

有了这两块配置,就不需要修改生成的源代码了。如果api规范更改了委托接口,那么您必须在MessageService中实现这些更改。

下面是对我原来文章的更新,以便更详细地解释服务实现如何绑定到委托接口。

openapi-gen生成的源位于单独的jar模块中,仅包含swagger.yaml和pom.xml作为签入的“源”。使用生成的代码的模块是一个war,它直接依赖于生成的jar。服务实现在war中,并在生成的源中实现MessageApiDelegate接口。Spring上下文从生成的代码中提取出来,您在openapi-gen config中定义为apiPackage和configPackage的包将在生成的OpenAPIUiConfiguration.java中添加为@ComponentScan的basePackages,因此您的服务实现必须放在apiPackages中或下面。

这是一个简化的结构,可以将这些部分组合在一起。

代码语言:javascript
运行
AI代码解释
复制
parent/
  swift-engin-service/ (generated jar module)
    swagger.yaml
    pom.xml
    target/generated-sources/openapi/src/main/java/eu/dorsum/swift/engine/
      appconfig/ (generated spring webmvc config)
        OpenAPIUiConfiguration.java
        WebApplication.java (brings up spring context by extending AbstractAnnotationConfigDispatcherServletInitializer)
      service/
        MessageApiController.java (@Controller, @RequestMapping etc.)
        MessageApiDelegate.java (implement this to get your service implementation plugged in the controller)
  swift-engine/ (war module, your code)
    pom.xml
    src/main/java/eu/dorsum/swift/engine/
      appconfig/
        EngineConfig.java (my spring config)
      service/api/ (must be the same as apiPackages property)
        MessageService.java (service implementation)

快速引擎/头文件的相关部分

代码语言:javascript
运行
AI代码解释
复制
<project>
    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>eu.dorsum.core.java.swift-engine</groupId>
            <artifactId>swift-engine-service</artifactId>
        </dependency>
    </dependencies>
</project>

eu.dorsum.swift.engine.service.api.MessageService相关部分

代码语言:javascript
运行
AI代码解释
复制
@Service
public class MessageService implements MessageApiDelegate {
    @Override
    public ResponseEntity<List<SwiftMessage>> listMessages(List<String> sorting, Integer pageStart, Integer pageSize, String filter) {
        // implementation
    }

    @Override
    public ResponseEntity<Void> updateMessage(SwiftMessage message) {
        // implementation
    }
}

eu.dorsum.swift.engine.appconfig.OpenAPIUiConfiguration的相关部分(生成)

代码语言:javascript
运行
AI代码解释
复制
@Configuration
@ComponentScan(basePackages = {"eu.dorsum.swift.engine.service.api", "eu.dorsum.swift.engine.appconfig"})
@EnableWebMvc
public class OpenAPIUiConfiguration extends WebMvcConfigurerAdapter {
    ...
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36742362

复制
相关文章
在现有线程安全类中添加功能
Java类库中包含许多有用的“基础模块”类。通常应该优先选择重用这些类而不是开发新类:重用能降低开发工作量、开发风险以及维护成本。很多情况这些现有的类只能提供大部分工作,我们需要在不破坏线程安全的情况下添加一些新的操作。 要添加一个新的原子操作,有以下几种方法: 第一种:修改原始的类 这种方法最简单最安全。但通常情况下无法访问或修改类的源代码。 第二种:扩展类机制(通过继承) 下面的代码中BetterVector扩展了Vector,并添加了新方法putIfAbsent。但并非所有的类都像Vector那样将状
SuperHeroes
2018/05/31
7160
Swagger UI 在Spring boot中的应用
Swagger UI是一个自动生成Java web接口文档的库。Swagger UI可以帮助前端开发者和后端开发者方便地进行沟通,后端开发者可以因此节省很多写接口文档的时间和精力,前端开发者也可以得到一个完备清晰的文档。
leaforbook
2019/03/01
2K0
Swagger UI 在Spring boot中的应用
Asp.Net WebApi在swagger中添加版本控制
在Asp.Net WebApi中添加版本控制,同时在swagger中按版本显示接口
用户6362579
2020/06/11
2.3K0
Spring Cloud Sleuth在Spring Boot应用程序中的集成
Spring Cloud Sleuth是一款用于构建分布式跟踪系统的Spring Cloud组件。它可以帮助我们追踪请求从开始到结束的整个流程,并收集所需的信息以进行监视和调试。本文将介绍如何在Spring Boot应用程序中集成Spring Cloud Sleuth。
堕落飞鸟
2023/04/11
2.5K0
外包精通--在 ArgoCD 中加载现有的 Helm 应用程序
GitOps 是为云原生应用程序实施持续部署的推荐方式。它通过在部署应用程序时最大限度地减少手动错误来帮助组织,因为 Git 将是唯一的真实来源。因此,可以轻松地跨团队跟踪更改。
Godev
2023/05/09
3.2K0
在Docker中开发Java 8 Spring Boot应用程序
在Docker中开发Java 8 Spring Boot应用程序
Nikoace
2018/01/03
2.8K0
创建 REST 服务简介
REST 命名自“Representational State Transfer”,具有以下属性:
用户7741497
2022/08/04
5950
如何在MySQL现有表中添加自增ID?
当在MySQL数据库中,自增ID是一种常见的主键类型,它为表中的每一行分配唯一的标识符。在某些情况下,我们可能需要在现有的MySQL表中添加自增ID,以便更好地管理和索引数据。在本文中,我们将讨论如何在MySQL现有表中添加自增ID,并介绍相关的步骤和案例。
网络技术联盟站
2023/08/03
2.2K0
如何在MySQL现有表中添加自增ID?
在 Spring Boot 项目中使用 Swagger 文档
Spring Boot 框架是目前非常流行的微服务框架,我们很多情况下使用它来提供 Rest API。而对于 Rest API 来说很重要的一部分内容就是文档,Swagger 为我们提供了一套通过代码和注解自动生成文档的方法,这一点对于保证 API 文档的及时性将有很大的帮助。本文将使用 Swagger 2 规范的 Springfox 实现来了解如何在 Spring Boot 项目中使用 Swagger,主要包含了如何使用 Swagger 自动生成文档、使用 Swagger 文档以及 Swagger 相关的一些高级配置和注解。
程序员小明
2019/06/03
1.7K0
在Docker环境中开发Java 8 Spring Boot应用程序
本文介绍了如何使用Docker构建Java 8 Spring Boot应用程序,并将其部署到Docker容器中。同时,文章还介绍了如何使用Docker进行数据库的初始化和数据的迁移。
Techeek
2018/01/04
3.8K0
在 Spring Boot 项目中使用 Swagger 文档
Spring Boot 框架是目前非常流行的微服务框架,我们很多情况下使用它来提供 Rest API。而对于 Rest API 来说很重要的一部分内容就是文档,Swagger 为我们提供了一套通过代码和注解自动生成文档的方法,这一点对于保证 API 文档的及时性将有很大的帮助。本文将使用 Swagger 2 规范的 Springfox 实现来了解如何在 Spring Boot 项目中使用 Swagger,主要包含了如何使用 Swagger 自动生成文档、使用 Swagger 文档以及 Swagger 相关的一些高级配置和注解。
beifengtz
2019/07/30
1.4K0
在 Spring Boot 项目中使用 Swagger 文档
Gin 框架: 添加 Swagger UI
boot.yaml 文件会告诉 rk-boot 如何启动 Gin 服务,下面的例子中,我们指定了端口,Swagger UI 的 json 文件路径。
尹东勋
2021/10/26
1.7K0
Gin 框架: 添加 Swagger UI
GoFrame 框架: 添加 Swagger UI
我们介绍 rk-boot 库,用户可以快速搭建基于 GoFrame 框架的微服务。
尹东勋
2021/12/14
1.5K0
GoFrame 框架: 添加 Swagger UI
Spring Boot & Swagger
本文接着前面的继续,介绍如何快速接入Swagger Spring Boot七分钟快速实践 Spring Boot & MyBatis Spring Boot & Redis Spring Boot & Swagger Spring Boot & 单元测试 Spring Boot & Actuator Spring Boot Admin 两步接入 pom.xml <dependency> <groupId>io.springfox</groupId> <artifactId>spring
十毛
2019/03/27
6770
Spring Boot & Swagger
spring boot 中添加模版
Yeah! 本文,我们谈谈如何在 spring boot 中添加模版,因为有时候我们也是需要后端渲染的嘛,比如公司官网,好吧~我听到某位前端小伙伴说用 node 呀,也行~
Jimmy_is_jimmy
2023/08/18
2010
spring boot 中添加模版
Echo 框架: 添加 Swagger UI
boot.yaml 文件会告诉 rk-boot 如何启动 Echo 服务,下面的例子中,我们指定了端口,Swagger UI 的 json 文件路径。
尹东勋
2021/11/02
1.2K0
Echo 框架: 添加 Swagger UI
十一.SpringBoot配置Swagger3
1.简介 ▌swagger介绍 Swagger 是一套基于 OpenAPI 规范(OpenAPI Specification,OAS)构建的开源工具,后来成为了 Open API 标准的主要定义者,现在最新的版本为17年发布的 Swagger3(Open Api3)。 国内绝大部分人还在用过时的swagger2(17年停止维护并更名为swagger3) 对于 Rest API 来说很重要的一部分内容就是文档,Swagger 为我们提供了一套通过代码和注解自动生成文档的方法,这一点对于保证API 文档的及时
十分钟空间
2022/08/17
2.7K0
十一.SpringBoot配置Swagger3
Swagger3.0官方starter诞生,可以扔掉那些野生starter了
对于 Rest API 来说很重要的一部分内容就是文档,Swagger 为我们提供了一套通过代码和注解自动生成文档的方法,这一点对于保证 API 文档的及时性将有很大的帮助。
业余草
2020/10/26
2.3K0
Swagger3.0官方starter诞生,可以扔掉那些野生starter了
2019年Spring Boot不可错过的22道面试题!
原文链接:https://blog.csdn.net/Design407/article/details/103263416
程序新视界
2019/12/02
8.3K0
面试之SpringBoot
多年来,随着新功能的增加,spring 变得越来越复杂。 只需访问 https://spring.io/projects页面,我们就会看到可以在我们的应用程序中使用的所有 Spring 项目的不同功能。 如果必须启动一个新的 Spring 项目,我们必须添加构建路径或添加 Maven 依赖关系,配置应用程序服务器,添加 spring 配置。因此,开始一个新的 spring 项目需要很多努力,因为我们现在必须从头开始做所有事情。
全栈程序员站长
2022/08/04
2.8K0

相似问题

用Gradle在Spring中从Swagger OpenAPI生成OpenAPI存根

15

Swagger服务器存根是什么意思?

40

来自swagger yaml的C#服务器存根

16

在现有Java应用程序中添加web接口(Spring )

26

在spring中禁用swagger

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文