微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swagger Codegen编译问题归因于下划线开头的字段

如何解决Swagger Codegen编译问题归因于下划线开头的字段

我有以下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/复制。

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

解决方法

解析属性名称(由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可能为您提供有关属性名称解析工作原理的线索。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。