引言
代码实现
自定义注解类 ApiJsonObject2package com.mybatis.plus.swagger;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Author wulongbo
* @Date 2020/9/14 17:20
* @Version 1.0
*/
@Target({ElementType.PARAMETER, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiJsonObject2 {
ApiJsonProperty2[] value(); //对象属性值
ApiJsonResult result() default @ApiJsonResult({});
String name() default "";
}
自定义注解类ApiJsonProperty2package com.mybatis.plus.swagger;
import io.swagger.annotations.Example;
import io.swagger.annotations.ExampleProperty;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Author wulongbo
* @Date 2020/9/14 17:23
* @Version 1.0
*/
@Target(ElementType.ANNOTATION_TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiJsonProperty2 {
String name();
String defaultValue() default "";
String description() default "";
String allowableValues() default "";
boolean required() default false;
String access() default "";
boolean allowMultiple() default false;
Class> type() default String.class ;
String paramType() default "";
String example() default "";
Example examples() default @Example(value = @ExampleProperty(mediaType = "", value = ""));
String format() default "";
boolean readOnly() default false;
String collectionFormat() default "";
}
自定义注解类 ApiJsonResultpackage com.mybatis.plus.swagger;
/**
* Created by yueh on 2018/9/7.
*/
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.ANNOTATION_TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiJsonResult {
String[] value();
String name() default "";
String type() default CommonData.RESULT_TYPE_NORMAL_FINAL;
}
ApiListingJsonScannerpackage com.mybatis.plus.swagger;
/**
* Created by yueh on 2018/9/12. */
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Optional;
import com.google.common.base.*;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Iterables;
import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.Multimap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import springfox.documentation.PathProvider;
import springfox.documentation.builders.ApiListingBuilder;
import springfox.documentation.schema.Model;
import springfox.documentation.service.*;
import springfox.documentation.spi.service.contexts.ApiListingContext;
import springfox.documentation.spi.service.contexts.DocumentationContext;
import springfox.documentation.spi.service.contexts.RequestMappingContext;
import springfox.documentation.spring.web.paths.PathMappingAdjuster;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.spring.web.plugins.DocumentationPluginsManager;
import springfox.documentation.spring.web.scanners.ApiDescriptionReader;
import springfox.documentation.spring.web.scanners.ApiListingScanner;
import springfox.documentation.spring.web.scanners.ApiListingScanningContext;
import springfox.documentation.spring.web.scanners.ApiModelReader;
import java.util.*;
import static com.google.common.base.Predicates.and;
import static com.google.common.collect.FluentIterable.from;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Sets.newHashSet;
import static java.util.stream.Collectors.toList;
import static springfox.documentation.builders.BuilderDefaults.nullToEmptyList;
import static springfox.documentation.spi.service.contexts.Orderings.methodComparator;
import static springfox.documentation.spi.service.contexts.Orderings.resourceGroupComparator;
@Component
@Primary
public class ApiListingJsonScanner extends ApiListingScanner {
private final ApiDescriptionReader apiDescriptionReader;
private final ApiModelReader apiModelReader;
private final DocumentationPluginsManager pluginsManager;
public static final String ROOT = "/";
@Autowired
public ApiListingJsonScanner(
ApiDescriptionReader apiDescriptionReader,
ApiModelReader apiModelReader,
DocumentationPluginsManager pluginsManager) {
super(apiDescriptionReader,apiModelReader,pluginsManager);
this.apiDescriptionReader = apiDescriptionReader;
this.apiModelReader = apiModelReader;
this.pluginsManager = pluginsManager;
}
static Optional longestCommonPath(List apiDescriptions) {
List commons = newArrayList();
if (null == apiDescriptions || apiDescriptions.isEmpty()) {
return Optional.absent();
}
List firstWords = urlParts(apiDescriptions.get(0));
for (int position = 0; position < firstWords.size(); position++) {
String word = firstWords.get(position);
boolean allContain = true;
for (int i = 1; i < apiDescriptions.size(); i++) {
List words = urlParts(apiDescriptions.get(i));
if (words.size() < position + 1 || !words.get(position).equals(word)) {
allContain = false;
break; }
}
if (allContain) {
commons.add(word);
}
}
Joiner joiner = Joiner.on("/").skipNulls();
return Optional.of("/" + joiner.join(commons));
}
static List urlParts(ApiDescription apiDescription) {
return Splitter.on('/')
.omitEmptyStrings()
.trimResults()
.splitToList(apiDescription.getPath());
}
public Multimap scan(ApiListingScanningContext context) {
final Multimap apiListingMap = LinkedListMultimap.create();
int position = 0;
Map> requestMappingsByResourceGroup
= context.getRequestMappingsByResourceGroup();
Collection additionalListings = pluginsManager.additionalListings(context);
Set allResourceGroups = FluentIterable.from(collectResourceGroups(additionalListings))
.append(requestMappingsByResourceGroup.keySet())
.toSet();
List securityReferences = newArrayList();
for (final ResourceGroup resourceGroup : sortedByName(allResourceGroups)) {
DocumentationContext documentationContext = context.getDocumentationContext();
Set produces = new LinkedHashSet(documentationContext.getProduces());
Set consumes = new LinkedHashSet(documentationContext.getConsumes());
String host = documentationContext.getHost();
Set protocols = new LinkedHashSet(documentationContext.getProtocols());
Set apiDescriptions = newHashSet();
Map models = new LinkedHashMap();
List requestMappings = nullToEmptyList(requestMappingsByResourceGroup.get(resourceGroup));
for (RequestMappingContext each : sortedByMethods(requestMappings)) {//url
Map knownModels = new HashMap<>();
models.putAll(apiModelReader.read(each.withKnownModels(models)));
apiDescriptions.addAll(apiDescriptionReader.read(each));
}
//
models.putAll(ModelCache.getInstance().getKnownModels());
List additional = from(addi