目前找不到相关的资料,只能自己debug进行修改
import cn.hutool.core.util.StrUtil;
import io.swagger.v3.core.util.RefUtils;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.media.*;
import io.swagger.v3.oas.models.parameters.Parameter;
import io.swagger.v3.oas.models.parameters.RequestBody;
import lombok.extern.slf4j.Slf4j;
import org.springdoc.core.customizers.GlobalOpenApiCustomizer;
import org.springframework.stereotype.Component;
/**
* 重写swagger文档
* 兼容JsonParam注解、@RequestBody注解时接收array类型参数
* 显示正确的请求参数类型
*
*/
@Slf4j
@Component
public class CustomerOperation implements GlobalOpenApiCustomizer {
@Override
public void customise(OpenAPI openApi) {
// 遍历所有文档,将post请求且请求参数类型为query的参数转换为body请求体
openApi.getPaths().forEach((k, v) -> {
Operation operation = v.getPost();
if (operation == null) {
return;
}
if (operation.getParameters() != null) {
if (operation.getRequestBody() == null || operation.getRequestBody().get$ref() == null) {
ObjectSchema objectSchema = new ObjectSchema();
for (Parameter parameter : operation.getParameters()) {
Schema schema = parameter.getSchema();
if (schema == null) {
schema = new StringSchema();
schema.name(parameter.getName());
}
schema.description(parameter.getDescription());
objectSchema.addProperty(parameter.getName(), schema);
if (parameter.getRequired() != null && parameter.getRequired()) {
objectSchema.addRequiredItem(parameter.getName());
}
}
// path+Dto 用于区分现有定义的DTO类(目前的DTO类都是大写的DTO),防止重复导致异常
String name = StrUtil.upperFirst(k.replaceAll("/", "").concat("Dto"));
openApi.getComponents().addSchemas(name, objectSchema);
// 只有使用$ref属性才能正常识别
RequestBody requestBody = new RequestBody().description("参数").content(new Content().addMediaType("application/json", new MediaType().schema(new ObjectSchema().$ref(RefUtils.constructRef(name)))));
operation.setRequestBody(requestBody);
} else {
MediaType mediaType = operation.getRequestBody().getContent().get("application/json");
String type = mediaType.getSchema().getType();
Parameter parameter = operation.getParameters().get(0);
if ("array".equals(type)) {
mediaType.getSchema().name(parameter.getName()).getItems().type(parameter.getName());
}
}
operation.setParameters(null);
}
});
}
}