SpringBoot+Swagger配置及注解详解

swagger配置及注解详解

   1.加入依赖的jar包

  

<!--引入swagger的依赖-->
     <dependency>
         <groupId>io.springfox</groupId>
         <artifactId>springfox-swagger2</artifactId>
         <version>2.9.2</version>
     </dependency>

     <dependency>
         <groupId>io.springfox</groupId>
         <artifactId>springfox-swagger-ui</artifactId>
          <version>2.9.2</version>
     </dependency>

2.配置swagger配置文件

 

package com.jt.config;

import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.google.common.base.Predicates;

import io.swagger.annotations.ApiOperation;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
 * Swagger2的接口配置
 * 在与spring boot集成时,放在与Application.java同级的目录下。
 * 通过@Configuration注解,让Spring来加载该类配置。
 * 再通过@EnableSwagger2注解来启用Swagger2。
 * @author DragonBai
 *
 */
@Configuration
@EnableSwagger2
@ConditionalOnExpression("${swagger.enable}") //开启访问接口文档的权限
public class SwaggerConfig {
    /**
     * 创建API
     */
    @Bean
    public Docket createRestApi() {
        return new Docket( DocumentationType.SWAGGER_2 )
                // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
                .apiInfo( apiInfo() )
                // 设置哪些接口暴露给Swagger展示
                .select()
                // (第一种方式)扫描所有有注解的api,用这种方式更灵活
                .apis( RequestHandlerSelectors.withMethodAnnotation( ApiOperation.class ) )
                // (第二种方式)扫描指定包中的swagger注解
                //.apis(RequestHandlerSelectors.basePackage("com.hubiao.pay.merchant.controller"))
                // (第三种方式)扫描所有 
                //.apis(RequestHandlerSelectors.any())
                .paths( PathSelectors.any() )
                //(第四种方式)只显示api路径下的页面
                //.paths(Predicates.and(PathSelectors.regex("/api/.*")))
                .build();
    }

    /**
     * 添加摘要信息
     * 创建该API的基本信息(这些基本信息会展现在文档页面中)
     * 访问地址:http://项目实际地址/swagger-ui.html
     */
    private ApiInfo apiInfo() {
        // 用ApiInfoBuilder进行定制
        return new ApiInfoBuilder()
                // 设置标题
                .title( "标题:商户应用API文档" )
                // 描述
                .description( "描述:向前端提供商户应用的ResultFul风格接口文档" )
                // 作者信息
                //.contact( "hubiao" )
                .contact(new Contact("DragonBai", "http://www.DragonBai.cn", "z591593455@qq.com"))
                // 版本
                .version( "版本号:" + "V1.0.0" )
                .build();
    }
}

3.生成swagger文档

package com.jt.controller;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.jt.pojo.Users;
import com.jt.server.UserService;
import com.jt.util.JsonResult;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
/**
 * Swagger使用的注解及其说明:

@Api:用在类上,说明该类的作用。

@ApiOperation:注解来给API增加方法说明。

@ApiParam:用对象来接收参数
   public ResponseEntity<Merchant> merchantAdd(@RequestBody @ApiParam(name="第一个参数", value = "Merchant", required = true)  Merchant merchant)
@ApiImplicitParams : 用在方法上包含一组参数说明。 @ApiImplicitParam:用来注解来给方法入参增加说明。 @ApiResponses:用于表示一组响应 @ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息 l code:数字,例如400 2 message:信息,例如"请求参数没填好" 3 response:抛出异常的类 例:方法返回void时 @ApiResponses(value = { @ApiResponse(code = 1, message = "当http状态码为200,且返回code=ok时,data集合中的对象结构", response = PersonResponse.class) }) @ApiModel:描述一个Model的信息(一般用在请求参数无法使用@ApiImplicitParam注解进行描述的时候) l @ApiModelProperty:描述一个model的属性 例:接收对象传参的例子在POJO上增加 //@ApiModel(value="医生对象模型") //public class DemoDoctor{ // @ApiModelProperty(value="id" ,required=true) // private Integer id; // @ApiModelProperty(value="医生姓名" ,required=true) // private String name;} 在后台采用对象接收参数时,Swagger自带的工具采用的是JSON传参, 测试时需要在参数上加入@RequestBody *
@author DragonBai * */ @Slf4j @RestController //用在类上,说明该类的作用。 @RequestMapping("/api") @Api(value = "商户平台应用接口",tags = "用户操作接口") public class UserSWController {//http://localhost:8090/swagger-ui.html#/ @Autowired private UserService userService; /** * @ApiImplicitParam的参数说明: * paramType:指定参数放在哪个地方: *1.header:请求参数放置于Request Header,使用@RequestHeader获取 2.query:请求参数放置于请求地址,使用@RequestParam获取 3.path:(用于restful接口)-->请求参数的获取:@PathVariable 4.body:请求参数放置body @RequestBody 5.form:请求参数放置form表单序列化(不常用) *name:参数名 *dataType:参数类型 int string long 小写 *required:参数是否必须传 true | false *value:说明参数的意思 *defaultValue:参数的默认值 * * @param userId * @return */ @ApiOperation(value="根据用户编号获取用户信息",httpMethod = "GET", notes="test: 仅1和2有正确返回") @ApiImplicitParam(paramType="path", name = "userId", value = "用户ID", required = true, dataType = "int",example = "7") //@GetMapping("/{userId}")//不能使用否则,访问不了页面 @RequestMapping(value = "/{userId}",method =RequestMethod.GET) public JsonResult<Users> getUser(@PathVariable Integer userId) { log.info("get user, userId="+userId); Users u = userService.getUser(userId); return JsonResult.ok(u); } @ApiOperation(value = "添加用户积分",httpMethod = "GET") @ApiImplicitParams({ @ApiImplicitParam(paramType="path", name = "userId", value = "用户ID", required = true, dataType = "int",example = "7"), @ApiImplicitParam(paramType="query", name = "score", value = "用户积分", required = true, dataType = "int",example = "100") }) //@GetMapping("/{userId}/score") @RequestMapping(value = "/{userId}/score",method =RequestMethod.GET) public JsonResult addScore(@PathVariable Integer userId, Integer score) { userService.addScore(userId, score); return JsonResult.ok(); } }

问题:找不到html页面可能是参数类型对应swagger错误,也可能是静态资源加载过滤

        paramType会直接影响程序的运行期,如果paramType与方法参数获取使用的注解不一致,会直接影响到参数的接收

       dataType类型要对应正确,否则swagger测试无法输入参数报红框,后台没有反应

       Conntroller中定义的方法必须在@RequestMapper中显示的指定RequestMethod类型,否则SawggerUi会默认为全类型皆可访问, API列表中会生成多条项目

        1.//@GetMapping("/{userId}")//不能使用否则,访问不了页面,@GetMapping("/{id}"), 正好与测试页面的网址相互冲突,去掉“/”

        2.过滤设置,不搬没错不用

       3.在使用@ApiModelProperty注解在字段上时,如果字段的类型为Long或是int类型,那么程序启动后,访问swagger-ui.html的页面,程序会报错
           #java.lang.NumberFormatException: For input string: ""

       解决:yml

#添加日志输出
logging:
  level:
    com.jt.mapper: debug
    io.swagger.models.parameters.AbstractSerializableParameter: error

 

    或者@ApiImplicitParam加上example

 

    @ApiImplicitParam(paramType="path", name = "userid", value = "用户ID", required = true, dataType = "int",example = "7")

 

     

//package com.jt.config;
//
//import org.springframework.context.annotation.Configuration;
//import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
//import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
//
//@Configuration
//public class WebMvcConfig extends WebMvcConfigurerAdapter {
//    @Override
//    public void addResourceHandlers(ResourceHandlerRegistry registry) {
//        //在配置静态资源时捕获swagger-ui.html映射到"classpath:/META-INF/resources/"
////        registry.addResourceHandler("swagger-ui.html")
////                .addResourceLocations("classpath:/META-INF/resources/");
//        
//        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
//        registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
//        
//        registry.addResourceHandler("/templates/**")
//                .addResourceLocations("classpath:/META-INF/resources/templates/");
//    }
//}
//

 

 

 

参考:https://blog.csdn.net/qq_39082353/article/details/109453310?utm_term=swagger%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%A6%E8%A7%A3

 

   https://blog.csdn.net/sanyaoxu_2/article/details/80555328

  https://blog.csdn.net/wyb880501/article/details/79576784

 

posted @ 2021-04-12 17:47  当当小丸子  阅读(1969)  评论(0编辑  收藏  举报