Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix some bug #544

Merged
merged 3 commits into from
Jul 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import io.dongtai.iast.api.openapi.domain.Schema;

import java.util.Collection;

/**
* 用于Java内置的集合类型的转换,比如List、Set、Map
*
Expand Down Expand Up @@ -31,10 +33,15 @@ public boolean canConvert(Class clazz) {
return clazz != null && (
listOpenApiSchemaConvertor.canConvert(clazz) ||
setOpenApiSchemaConvertor.canConvert(clazz) ||
mapOpenApiSchemaConvertor.canConvert(clazz)
mapOpenApiSchemaConvertor.canConvert(clazz) ||
isCollectionClass(clazz)
);
}

private boolean isCollectionClass(Class clazz) {
return clazz != null && Collection.class.isAssignableFrom(clazz);
}

@Override
public Schema convert(Class clazz) {
if (listOpenApiSchemaConvertor.canConvert(clazz)) {
Expand All @@ -43,6 +50,8 @@ public Schema convert(Class clazz) {
return setOpenApiSchemaConvertor.convert(clazz);
} else if (mapOpenApiSchemaConvertor.canConvert(clazz)) {
return mapOpenApiSchemaConvertor.convert(clazz);
} else if (isCollectionClass(clazz)) {
return listOpenApiSchemaConvertor.convert(clazz);
} else {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ private List<Field> parseFieldList(Class clazz) {

List<Field> allFieldList = new ArrayList<>();
Set<String> fieldNameSet = new HashSet<>();
Set<String> getterNameLowercaseSet = new HashSet<>();
Set<String> setterNameLowercaseSet = new HashSet<>();
Class currentClass = clazz;

while (currentClass != null && currentClass != Object.class) {
Expand All @@ -104,7 +104,7 @@ private List<Field> parseFieldList(Class clazz) {
}

// 收集类上的方法名字
getterNameLowercaseSet.addAll(parseGetterNameLowercaseSet(currentClass));
setterNameLowercaseSet.addAll(parseSetterNameLowercaseSet(currentClass));

// 再处理父类,一路向上知道找到根
currentClass = currentClass.getSuperclass();
Expand All @@ -113,7 +113,7 @@ private List<Field> parseFieldList(Class clazz) {
// 然后筛选出来符合条件的字段,作为bean的属性
List<Field> beanFieldList = new ArrayList<>();
allFieldList.forEach(field -> {
if (isBeanField(field, getterNameLowercaseSet)) {
if (isBeanField(field, setterNameLowercaseSet)) {
beanFieldList.add(field);
}
});
Expand All @@ -125,41 +125,36 @@ private List<Field> parseFieldList(Class clazz) {
* 判断Field是否是bean的field
*
* @param field
* @param getterNameLowercaseSet
* @param setterNameLowercaseSet
* @return
*/
private boolean isBeanField(Field field, Set<String> getterNameLowercaseSet) {
private boolean isBeanField(Field field, Set<String> setterNameLowercaseSet) {

// 采用白名单的方式,public并且是实例方法则认为是可以的
if (Modifier.isPublic(field.getModifiers())) {
return !Modifier.isStatic(field.getModifiers()) && !Modifier.isFinal(field.getModifiers());
}

// 私有方法并且有对应的getter
String setterMethodName = "";
if (field.getType() == boolean.class || field.getType() == Boolean.class) {
setterMethodName = "is" + field.getName().toLowerCase();
} else {
setterMethodName = "get" + field.getName().toLowerCase();
}
return getterNameLowercaseSet.contains(setterMethodName);
String setterMethodName = "set" + field.getName().toLowerCase();
return setterNameLowercaseSet.contains(setterMethodName);
}

/**
* 解析类上的getter方法,并将其方法名都转为小写返回
* 解析类上的setter方法,并将其方法名都转为小写返回
*
* @param clazz
* @return
*/
private Set<String> parseGetterNameLowercaseSet(Class clazz) {
Set<String> getterNameLowercaseSet = new HashSet<>();
private Set<String> parseSetterNameLowercaseSet(Class clazz) {
Set<String> setterNameLowercaseSet = new HashSet<>();
for (Method declaredMethod : clazz.getDeclaredMethods()) {
// 这里采用比较简单的策略,只要是关键字开头的就认为是ok的
if (declaredMethod.getName().startsWith("get") || declaredMethod.getName().startsWith("is")) {
getterNameLowercaseSet.add(declaredMethod.getName().toLowerCase());
if (declaredMethod.getName().startsWith("set")) {
setterNameLowercaseSet.add(declaredMethod.getName().toLowerCase());
}
}
return getterNameLowercaseSet;
return setterNameLowercaseSet;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import io.dongtai.iast.api.openapi.domain.DataType;
import io.dongtai.iast.api.openapi.domain.Schema;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

Expand All @@ -21,6 +22,7 @@ public class PrimitiveTypeConvertor extends BaseOpenApiSchemaConvertor {

// 这里把String也看做是primitive的了 ,虽然看起来可能有点奇怪...
primitiveTypeSet.add(String.class);
primitiveTypeSet.add(Date.class);

primitiveTypeSet.add(Character.class);
primitiveTypeSet.add(char.class);
Expand Down Expand Up @@ -74,6 +76,8 @@ public Schema convert(Class simpleClass) {
// 字符串类型和字符类型都修改为字符串类型,注意这里产生了一个类型丢失
if (simpleClass == String.class || simpleClass == Character.class || simpleClass == char.class) {
return new Schema(DataType.String());
} else if (simpleClass == Date.class) {
return new Schema(DataType.Date());
} else if (simpleClass == Byte.class || simpleClass == byte.class ||
simpleClass == Short.class || simpleClass == short.class ||
simpleClass == Integer.class || simpleClass == int.class) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,10 @@ public static DataType String() {
return new DataType("string", null, null);
}

public static DataType Date() {
return new DataType("string", "date-time", null);
}

public static DataType StringArray() {
return Array(String());
}
Expand Down