Spring OpenApi Generator 6.6.0:Delegate与Controller生成及映射冲突解决
解决Spring OpenApi Generator 6.6.0版本Controller映射冲突问题
方案一:禁止生成Controller上的@RequestMapping注解
在你的openApiGenerate任务的configOptions中添加controllerRequestMapping: "false"配置,生成的Controller类将不再自动添加@RequestMapping注解,直接避免路径冲突:
openApiGenerate { generatorName = "spring" inputSpec = "$projectDir/src/main/resources/openapi.yaml" outputDir = "$buildDir/generated" apiPackage = "com.myapp.web.api.controller" invokerPackage = "com.myapp.web.api.invoker" modelPackage = "com.myapp.web.api.model" modelNamePrefix = "Dto" configOptions = [ openApiNullable: "false", useSwaggerUI: "false", delegatePattern: "true", useTags: "true", implicitHeaders: "true", additionalModelTypeAnnotations: "@lombok.AllArgsConstructor;@lombok.NoArgsConstructor;@lombok.Builder(toBuilder = true)", performBeanValidation: "true", generatedConstructorWithRequiredArgs: "false", // 新增配置:禁用Controller类上的@RequestMapping注解 controllerRequestMapping: "false" ] }
方案二:统一配置API基础路径
如果需要保留基础路径映射,可在openapi.yaml中通过servers节点全局指定基础路径,替代生成的@RequestMapping:
openapi: 3.0.3 servers: - url: /api/v1 description: 默认服务路径 # 其他OpenAPI配置内容...
同时在configOptions中补充basePath: "/api/v1",确保生成的接口方法路径自动拼接全局基础路径,避免重复映射。
方案三:自定义Controller实现
开启interfaceOnly: "true"仅生成API接口,自行编写Controller类实现接口并手动控制路径映射,完全掌控路由规则:
configOptions = [ // 其他配置... interfaceOnly: "true" ]
手动创建Controller类示例:
@RestController @RequestMapping("/custom-stuff") public class CustomStuffApiController implements StuffApi { private final StuffApiDelegate delegate; public CustomStuffApiController(StuffApiDelegate delegate) { this.delegate = delegate; } // 实现接口方法,直接调用delegate对应逻辑 @Override public ResponseEntity<DtoStuff> getStuff(@PathVariable String id) { return delegate.getStuff(id); } }
额外排查点
- 检查
openapi.yaml中是否存在重复的路径或标签定义,导致生成的Controller路由冲突 - 确认项目中已有自定义Controller的路径,是否与生成的Controller路径重叠
内容的提问来源于stack exchange,提问作者JoeBloggs
相关产品推荐
相关产品推荐

