由于以下划线开头的字段导致 Swagger codegen 编译问题

Swagger codegen compilation issues due to field starting with an underscore

我有以下 openApi 定义,请注意 type_type 字段:

openapi: 3.0.1
info:
  title: 'title'
  description: 'description'
  version: 1.0.0
paths:
  /pet:
    get:
      responses:
        200:
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Pet'
components:
  schemas:
    Pet:
      type: object
      properties:
        type:
          type: string
        _type:
          type: string

当我尝试使用上述方法生成 Java 客户端时,我在 io.swagger.client.model.Pet

中得到以下结果
public class Pet {
...
   /**
   * Get type
   * @return type
  **/
  @Schema(description = "")
  public String getType() {
    return type;
  }

  public void setType(String type) {
    this.type = type;
  }

  public Pet _type(String _type) {
    this._type = _type;
    return this;
  }

   /**
   * Get _type
   * @return _type
  **/
  @Schema(description = "")
  public String getType() {
    return _type;
  }

  public void setType(String _type) {
    this._type = _type;
  }
...
}

由于方法 getTypesetType 重复,因此无法编译。如何更新我的 openApi 以避免这种情况?

我不在乎使用什么 getter/setter 方法,但是我无法更改字段名称。

这可以使用 https://editor.swagger.io/ 重现。

更新:我已经从我最初发布的内容中简化了我的问题,其中包括 java 类 openApi 定义 l 是从中生成的。

解析 属性 名称(由PropertyNamingStrategy 完成)时会出现此问题。因此,通常第一个 _ 可能会被跳过。例如 PropertyNamingStrategy.SNAKE_CASE 使用:

private static String toSnakeCase(String input) {
            if (input == null) return input;
            int length = input.length();
            StringBuilder result = new StringBuilder(length * 2);
            int resultLength = 0;
            boolean wasPrevTranslated = false;
            for (int i = 0; i < length; i++) {
                char c = input.charAt(i);
                if (i > 0 || c != '_') // skip first starting underscore
                {
                    if (Character.isUpperCase(c)) {
                        if (!wasPrevTranslated && resultLength > 0 && result.charAt(resultLength - 1) != '_') {
                            result.append('_');
                            resultLength++;
                        }
                        c = Character.toLowerCase(c);
                        wasPrevTranslated = true;
                    } else {
                        wasPrevTranslated = false;
                    }
                    result.append(c);
                    resultLength++;
                }
            }
            return resultLength > 0 ? result.toString() : input;
        }

 

link 可能会让您了解 属性 名称解析的工作原理。