如何解决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;
}
...
}
由于方法getType
和setType
是重复的,因此不会编译。如何更新我的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 举报,一经查实,本站将立刻删除。