派对有点晚了,但是由于SpringFox依赖Spring bean来构建文档,我们可以轻松地操作它.希望这可以帮助别人!
将其注册为bean
@Primary @Bean public ApiListingScanner addExtraOperations(ApiDescriptionReader apiDescriptionReader, ApiModelReader apiModelReader, DocumentationPluginsManager pluginsManager) { return new FormLoginOperations(apiDescriptionReader, apiModelReader, pluginsManager); }
用于手动添加任何操作的类:
import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpMethod; import com.fasterxml.classmate.TypeResolver; import com.google.common.collect.Multimap; import springfox.documentation.builders.ApiListingBuilder; import springfox.documentation.builders.OperationBuilder; import springfox.documentation.builders.ParameterBuilder; import springfox.documentation.schema.ModelRef; import springfox.documentation.service.ApiDescription; import springfox.documentation.service.ApiListing; import springfox.documentation.service.Operation; import springfox.documentation.spring.web.plugins.DocumentationPluginsManager; import springfox.documentation.spring.web.readers.operation.CachingOperationNameGenerator; 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; public class FormLoginOperations extends ApiListingScanner { @Autowired private TypeResolver typeResolver; @Autowired public FormLoginOperations(ApiDescriptionReader apiDescriptionReader, ApiModelReader apiModelReader, DocumentationPluginsManager pluginsManager) { super(apiDescriptionReader, apiModelReader, pluginsManager); } @Override public Multimapscan(ApiListingScanningContext context) { final Multimap def = super.scan(context); final List apis = new LinkedList<>(); final List operations = new ArrayList<>(); operations.add(new OperationBuilder(new CachingOperationNameGenerator()) .method(HttpMethod.POST) .uniqueId("login") .parameters(Arrays.asList(new ParameterBuilder() .name("username") .description("The username") .parameterType("query") .type(typeResolver.resolve(String.class)) .modelRef(new ModelRef("string")) .build(), new ParameterBuilder() .name("password") .description("The password") .parameterType("query") .type(typeResolver.resolve(String.class)) .modelRef(new ModelRef("string")) .build())) .summary("Log in") // .notes("Here you can log in") .build()); apis.add(new ApiDescription("/api/login/", "Authentication documentation", operations, false)); def.put("authentication", new ApiListingBuilder(context.getDocumentationContext().getApiDescriptionOrdering()) .apis(apis) .description("Custom authentication") .build()); return def; } }
渲染Swagger json:
"/api/login/" : { "post" : { "summary" : "Log in", "description" : "Here you can log in", "operationId" : "loginUsingPOST", "parameters" : [ { "name" : "username", "in" : "query", "description" : "The username", "required" : false, "type" : "string" }, { "name" : "password", "in" : "query", "description" : "The password", "required" : false, "type" : "string" } ] } }