由于以下划线开头的字段导致 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;
}
...
}
由于方法 getType
和 setType
重复,因此无法编译。如何更新我的 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 可能会让您了解 属性 名称解析的工作原理。
我有以下 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/ 重现。
更新:我已经从我最初发布的内容中简化了我的问题,其中包括 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 可能会让您了解 属性 名称解析的工作原理。