OpenAPI Angular/TypeScript客户端生成器为不同控制器下同名方法自动追加数字,如何配置避免?
看起来你遇到的问题是OpenAPI生成器为了避免同名操作冲突,自动给方法名加数字后缀,但这个后缀不稳定,导致每次生成客户端都要改代码——我之前也碰到过类似的坑,给你几个可行的解决方案:
问题根源
你之前尝试给所有search方法都加@Operation(operationId = "search"),但这反而会让OpenAPI认为这些是重复的操作(因为operationId必须全局唯一),所以生成器还是会自动加数字区分。解决的核心是让每个API方法的operationId唯一,然后强制生成器用这个ID作为方法名。
方案1:手动设置唯一的operationId
给每个控制器的search方法设置独一无二的operationId,比如结合控制器名称来命名:
在Controller1的search方法上:
@Operation(operationId = "searchController1") @GetMapping("/controller1/search") public ResponseEntity<List<YourEntity1>> search(...) { // 业务逻辑 }
在Controller2的search方法上:
@Operation(operationId = "searchController2") @GetMapping("/controller2/search") public ResponseEntity<List<YourEntity2>> search(...) { // 业务逻辑 }
然后修改你的生成命令,添加useOperationId=true参数,强制生成器使用你定义的operationId作为方法名:
java -jar "C:\Program Files\openapi-6.0.1\openapi-generator-cli-6.0.1.jar" generate -i http://localhost:9999/v3/api-docs -g typescript-angular -o ./client/ --additional-properties ngVersion=10,npmName=angular-eforms-client,npmVersion=0.0.1,useOperationId=true --type-mappings=set=Array,DateTime=Date
这样生成的客户端方法名就会是searchController1和searchController2,不会再自动加数字,而且每次生成的名称都稳定。
方案2:让SpringDoc自动生成唯一的operationId
如果你不想手动给每个方法加注解,可以通过配置SpringDoc(假设你用它生成OpenAPI文档)自动生成唯一的operationId。在你的Spring Boot项目的application.properties或application.yml中添加:
springdoc.api-docs.operation-id-strategy=controller_method_name
这个配置会让SpringDoc自动生成类似controller1_search、controller2_search的operationId(格式是控制器名称_方法名),不用你手动写@Operation注解。然后同样在生成命令中加上useOperationId=true参数,就能得到稳定的方法名了。
验证一下
生成客户端后,你可以去client/api目录下的对应API类里看看,方法名应该已经变成你设置的(或自动生成的)唯一名称,不会再出现search1、search2这种不稳定的后缀了。
备注:内容来源于stack exchange,提问作者JDalri

