zoukankan      html  css  js  c++  java
  • 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
     


  • 相关阅读:
    Nginx-limit_req限速配置示例
    Linux-配置虚拟IP实例
    jQuery中获取a标签的值
    js时间格式化
    a标签与js的冲突
    spring MVC页面的重定向
    EL表达式遍历集合获取下标
    商城项目之实战-购物车模块
    js中得计算问题算式结果拼接成字符串怎么解决
    js中数值类型相加变成拼接字符串的问题
  • 原文地址:https://www.cnblogs.com/rocky-fang/p/12557959.html
Copyright © 2011-2022 走看看