使用 Multiclass API 重复 `operationId`

Duplicate `operationId` with Multiclass API

当我尝试使用 gcloud service-management deploy openapi.json 部署我的 Cloud Endpoints Framework api 时,我收到许多类似于以下内容的错误:

ERROR: openapi.json: Operation 'get' in path '/sd/v1/groups/{id}': operationId 'SdGet' has duplicate entry

检查生成的 openapi.json 文档,我发现它有很多重复的 operationId。例如,请注意这两个都使用 SdGet:

{
  ...
  "paths": {
      "/sd/v1/feeds/{id}": {
      "get": {
        "operationId": "SdGet",
        ...
      }
    },
    "/sd/v1/groups/{id}": {
      "get": {
        "operationId": "SdGet",
        ...
      }
    }
  }
}

我的后端在 Java。我有一个使用继承的多类 API,这似乎符合 the docs 中的建议。以下是此示例的相关部分:

@Api(name = "sd", ...)
public class Endpoints { ... }

public class FeedEndpoints extends Endpoints {
    @ApiMethod(
        path = "feeds/{id}",
        name = "feeds.get",
        httpMethod = HttpMethod.GET)
    public Feed get(...) { ... }

    ...
}

public class GroupEndpoints extends Endpoints {
    @ApiMethod(
        path = "groups/{id}",
        name = "groups.get",
        httpMethod = HttpMethod.GET)
    public Group get(...) { ... }

    ...
}

为了生成 openapi.json,我根据 Google 的 getting started 指南对我的配置进行了建模。所以在 pom.xml 我有这样的东西,它让我用命令 mvn exec:java -DGetSwaggerDoc:

生成它
<profiles>
    <profile>
        <id>GetSwaggerDoc</id>
        ...
        <build>
            <plugins>
                <plugin>
                    ...
                    <configuration>
                        ...
                        <arguments>
                            <argument>get-swagger-doc</argument>
                            <argument>--hostname=echo-api.endpoints.${endpoints.project.id}.cloud.goog</argument>
                            <argument>--war=target/blah-1.0-SNAPSHOT</argument>
                            <argument>blah.FeedEndpoints</argument>
                            <argument>blah.GroupEndpoints</argument>
                            ...
                        </arguments>
                    </configuration>
                    ...
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

我做错了什么?我怎样才能以不同的方式定义事物,以便生成的 api 规范不使用重复的 ID?

@saiyr 告诉我这是框架中的一个错误(请参阅问题的评论),所以我提交了一份报告 here。现在我通过将所有端点 类 中的 API 方法重命名为唯一来解决它,如下所示:

@Api(...)
public class Endpoints { ... }

public class FeedEndpoints extends Endpoints {
    @ApiMethod(...)
    public Feed getFeed(...) { ... }
    ...
}

public class GroupEndpoints extends Endpoints {
    @ApiMethod(...)
    public Group getGroup(...) { ... }
    ...
}