in dubbo-api-docs/dubbo-api-docs-core/src/main/java/org/apache/dubbo/apidocs/core/DubboApiDocsAnnotationScanner.java [305:400]
private List<ParamBean> processField(Class<?> argClass, Type parameterType, Parameter parameter) {
Map<String, String> genericTypeAndNamesMap;
if (parameterType instanceof ParameterizedType) {
ParameterizedType parameterTypeImpl = (ParameterizedType) parameterType;
Type rawType = parameterTypeImpl.getRawType();
if (rawType instanceof Class<?>) {
TypeVariable<? extends Class<?>>[] typeVariables = ((Class<?>) rawType).getTypeParameters();
Type[] actualTypeArguments = parameterTypeImpl.getActualTypeArguments();
genericTypeAndNamesMap = new HashMap<>(typeVariables.length);
for (int i = 0; i < typeVariables.length; i++) {
genericTypeAndNamesMap.put(typeVariables[i].getTypeName(), actualTypeArguments[i].getTypeName());
}
} else {
genericTypeAndNamesMap = Collections.emptyMap();
}
} else {
genericTypeAndNamesMap = Collections.emptyMap();
}
List<ParamBean> apiParamsList = new ArrayList<>(16);
// get all fields
List<Field> allFields = ClassTypeUtil.getAllFields(null, argClass);
if (allFields.size() > 0) {
for (Field field : allFields) {
if (SKIP_FIELD_SERIALVERSIONUID.equals(field.getName()) || SKIP_FIELD_THIS$0.equals(field.getName())) {
continue;
}
ParamBean paramBean = new ParamBean();
paramBean.setName(field.getName());
String genericTypeName = genericTypeAndNamesMap.get(field.getGenericType().getTypeName());
Class<?> genericType = null;
if (StringUtils.isBlank(genericTypeName)) {
paramBean.setJavaType(field.getType().getCanonicalName());
} else {
paramBean.setJavaType(genericTypeName);
genericType = ClassTypeUtil.makeClass(genericTypeName);
}
RequestParam requestParam = null;
if (field.isAnnotationPresent(RequestParam.class)) {
// Handling @RequestParam annotations on properties
requestParam = field.getAnnotation(RequestParam.class);
paramBean.setDocName(requestParam.value());
paramBean.setRequired(requestParam.required());
paramBean.setDescription(requestParam.description());
paramBean.setExample(requestParam.example());
paramBean.setDefaultValue(requestParam.defaultValue());
} else {
paramBean.setRequired(false);
}
ParamBean tempParamBean = this.processHtmlType(null == genericType ?
field.getType() : genericType, requestParam, paramBean);
if (tempParamBean == null || HtmlTypeEnum.TEXT_AREA.equals(tempParamBean.getHtmlType())) {
Object objResult;
if (null == genericType) {
objResult = ClassTypeUtil.initClassTypeWithDefaultValue(
field.getGenericType(), field.getType(), 0, genericTypeAndNamesMap);
} else {
objResult = ClassTypeUtil.initClassTypeWithDefaultValue(
ClassTypeUtil.makeParameterizedType(genericTypeName), genericType, 0,
true, genericTypeAndNamesMap);
}
if (!ClassTypeUtil.isBaseType(objResult)) {
paramBean.setHtmlType(HtmlTypeEnum.TEXT_AREA);
paramBean.setSubParamsJson(JSON.toJSONString(objResult, ClassTypeUtil.FAST_JSON_FEATURES));
}
}
apiParamsList.add(paramBean);
}
} else {
ParamBean paramBean = new ParamBean();
paramBean.setName(parameter.getName());
paramBean.setJavaType(argClass.getCanonicalName());
RequestParam requestParam = null;
if (parameter.isAnnotationPresent(RequestParam.class)) {
// Handling @RequestParam annotations on properties
requestParam = parameter.getAnnotation(RequestParam.class);
paramBean.setDocName(requestParam.value());
paramBean.setRequired(requestParam.required());
paramBean.setDescription(requestParam.description());
paramBean.setExample(requestParam.example());
paramBean.setDefaultValue(requestParam.defaultValue());
} else {
paramBean.setRequired(false);
}
Object objResult = ClassTypeUtil.initClassTypeWithDefaultValue(
parameterType, argClass, 0, genericTypeAndNamesMap);
if (!ClassTypeUtil.isBaseType(objResult)) {
paramBean.setHtmlType(HtmlTypeEnum.TEXT_AREA);
paramBean.setSubParamsJson(JSON.toJSONString(objResult, ClassTypeUtil.FAST_JSON_FEATURES));
}
apiParamsList.add(paramBean);
}
return apiParamsList;
}