swagger2 springmvc篇

公司同事分享了一篇springboot 中使用swagger2的wiki 供大家使用,这边项目是springmvc,记录下。

相关配置 pom.xml
<!-- swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
<exclusions>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
<version>2.9.2</version>
<exclusions>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.9.3</version>
</dependency>
<!-- swagger -->
<guava.version>20.0</guava.version>
 
swagger-properties  dev/ test/
swagger.production=false
swagger.basic.enable=false
swagger.basic.username=admin
swagger.basic.password=123
 
swagger-properties  prod/ pre/
swagger.production=true
swagger.basic.enable=true
swagger.basic.username=admin
swagger.basic.password=123
相关源码
 
import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.validation.MessageCodesResolver;
import org.springframework.validation.Validator;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.*;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
 
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
 
/**
* @Author: rocky
* @Date: Created in 2020/3/17.
*/
@Slf4j
@Configuration
@EnableSwagger2
@EnableWebMvc
@EnableSwaggerBootstrapUI
public class Swagger2Config implements WebMvcConfigurer {
 
@Override
public void addFormatters(FormatterRegistry registry) {
 
}
 
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
 
}
 
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
 
}
 
@Override
public Validator getValidator() {
return null;
}
 
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
 
}
 
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
 
}
 
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
 
}
 
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
 
}
 
@Override
public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
 
}
 
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
 
}
 
@Override
public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> list) {
 
}
 
@Override
public void addInterceptors(InterceptorRegistry registry) {
 
}
 
@Override
public MessageCodesResolver getMessageCodesResolver() {
return null;
}
 
@Override
public void addViewControllers(ViewControllerRegistry registry) {
 
}
 
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
 
}
 
/**
* 显示swagger-ui.html文档展示页,还必须注入swagger资源:
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
 
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
 
}
 
@Override
public void addCorsMappings(CorsRegistry registry) {
 
}
 
/**
* swagger2的配置文件,这里可以配置swagger2的一些基本的内容,比如扫描的包等等
*/
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.useDefaultResponseMessages(false)
.consumes(new HashSet<String>(){{add("application/x-www-form-urlencoded");add("text/html");}})
.produces(new HashSet<String>(){{add("application/json");}})
.apiInfo(apiInfo())
.select()
//可以设置指定包路径
.apis(RequestHandlerSelectors.basePackage("com.sq.integral.api.restful"))
//加了ApiOperation注解的类,才生成接口文档
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.paths(PathSelectors.any())
.build();
// .globalOperationParameters(setHeaderToken());
}
 
/**
* 设置header参数,主要是会了在 swagger.html测试接口输入参数方便
* 比如端上有些必传的header,car-token
* 这边不用token,去掉了,到时可以加些需要的参数
*/
private List<Parameter> setHeaderToken() {
List<Parameter> pars = new ArrayList<>();
// ParameterBuilder tokenPar = new ParameterBuilder();
// tokenPar.name(CommonConstant.X_ACCESS_TOKEN).description("token,参考 header 头信息").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
// pars.add(tokenPar.build());
return pars;
}
 
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("平台API文档")
.version("1.0")
.termsOfServiceUrl("NO terms of service")
.description("相关服务")
.contact(new Contact("wang", "http://.com", ""))
.license("有限公司Inc. All Rights Reserved")
.licenseUrl("https://.com/")
.build();
}
}
 
###
Controller HelloSwagger .java
 
import com.sq.integral.core.pojo.ResponseMsgResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
/**
* @Author: rocky
* @Date: Created in 2020/3/18.
*/
@RestController
@Api(value = "demo", description = "first swagger2 program")
@RequestMapping("/swagger2")
public class HelloSwagger {
 
@RequestMapping("hello")
@ApiOperation(value = "name")
public ResponseMsgResult sayHello(@ApiParam(value = "name") String name){
return new ResponseMsgResult(name);
}
}
 
问题一:
报这个错的话:  Caused by: java.lang.NoSuchMethodError: org.springframework.aop.framework.AopProxyUtils.getSingletonTarget(Ljava/lang/Object;)Ljava/lang/Object;
处理: spring jar包版本不一致
问题二:
报这个错的话 : Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'webMvcRequestHandlerProvider'
处理 :  添加 @EnableWebMvc
问题三:
guava version 18.0   报 Failed to start bean 'documentationPluginsBootstrapper'; nested exception is com.google.common.util.concurrent.ExecutionError: java.lang.NoSuchMethodError: com.google.common.collect.FluentIterable.concat(Ljava/lang/Iterable;Ljava/lang/Iterable;)Lcom/google/common/collect/FluentIterable;
处理: 升级guava jar 到 如下版本
问题四:
guava version 25.1-jre/23.0 报 com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor()Lcom/google/common/util/concurrent/ListeningExecutorService;
处理: 升级jar 到 如下版本
问题五:
curator 3个jar升级4.2.0/4.1.0 curator-framework,curator-client,curator-recipes 之后 spring起来了,mvc没反应,也不报错
处理:以上操作不对,回滚步骤到问题三
最终
 造成问题三该错误的原因是,Springfox-swagger引用的guava版本相对于你项目中版本较高,此时和低版本的guava引起冲突.
Springfox-Swagger中guava的版本为20, 调整guava-jar 为20.0
 
swagger默认访问地址 http://XXX/swagger-ui.html
swagger json 地址 http://XXX/v2/api-docs
美化地址 http://XXX/doc.html
YApi 相关 
 
 
 
pic-2
 


原文地址:https://www.cnblogs.com/rocky-fang/p/12557959.html