我可以看到这是一个相当老的问题,但我为此付出了很多努力,我收集的信息可能对其他人有用,直到生成器文档得到改进。
此描述用于使用 openapi-generator-maven-plugin 从 OpenApi 3.0.0 规范生成和使用 spring-mvc 服务器存根。
不要使用swagger-codegen,而是使用openapi生成器:https ://github.com/OpenAPITools/openapi-generator (fork的推理在这里:https ://github.com/OpenAPITools/openapi-generator/blob/主/文档/qna.md)
为服务器内容创建一个单独的项目/模块并配置 Maven 插件。
<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
为真。这个我非常喜欢!这将生成一个额外的委托接口,您的服务器控制器可以实现该接口。生成的 ApiController 会将所有服务调用委托给此接口,因此您可以非常优雅地插入您的实现。在我的设置中,我有这个链:MessageApi(生成的接口)-> MessageApiController 实现 MessageApi(生成的 mvc 控制器)-> MessageApiDelegate(生成的接口)-> MessageService 实现 MessageApiDelegate(我的服务方法的实现)。
有了这两个配置,就无需修改生成的源。如果 api 规范更改了委托接口更改,您必须在 MessageService 中实现这些更改。
下面是对我原始帖子的更新,以更详细地解释服务实现如何绑定到委托接口。
openapi-gen 生成的源位于一个单独的 jar 模块中,其中仅包含 swagger.yaml 和 pom.xml 作为签入的“源”。使用生成代码的模块是直接依赖于生成的 jar 的战争。服务实现在战争中,并实现了生成源中的 MessageApiDelegate 接口。从生成的代码中提取 Spring 上下文,您在 openapi-gen config 中定义为 apiPackage 和 configPackage 的包将在生成的 OpenAPIUiConfiguration.java 中作为 @ComponentScan 的 basePackages 添加,因此您的服务实现必须放在 apiPackages 中或之下。
这是将各个部分组合在一起的简化结构。
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)
swift-engine/pom.xml 的相关部分
<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 的相关部分
@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 的相关部分(生成)
@Configuration
@ComponentScan(basePackages = {"eu.dorsum.swift.engine.service.api", "eu.dorsum.swift.engine.appconfig"})
@EnableWebMvc
public class OpenAPIUiConfiguration extends WebMvcConfigurerAdapter {
...
}