swagger学习⽇记1swagger测试接⼝时传⼊参数的类型问题问题现象:
今天在学习swagger做接⼝api说明的时候,出现了⼀个⼀直解决不了的问题,⽽且⽹上搜了很久,都不到任何相似的问题和解决⽅法:当⽤swagger测试⼀个需要传⼊(Integer数据类型)参数的接⼝时,⼀直是显⽰红框状态,不能被execute(执⾏),没有任何错误提⽰!
问题分析:
于是我就通过以下⼏个⽅⾯去查看问题所在:
1.swagger依赖:(没问题)
<!--swaggerUI-->
<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配置类(没问题):
import org.springframework.beans.factory.annotation.Value;
import t.annotation.Bean;
import t.annotation.Configuration;
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;
@Configuration
@EnableSwagger2//注解开启 swagger2 功能
public class Swagger2Config {
//是否开启swagger,正式环境⼀般是需要关闭的
@Value("${abled}")
private boolean enableSwagger;
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()) //信息会在页⾯上展⽰
.enable(enableSwagger)//是否开启 (true 开启 false隐藏。⽣产环境建议隐藏)
.select().apis(RequestHandlerSelectors.basePackage("com.ller"))//扫描的路径包,设置basePackage会将包下的所有被@Api标记类的 .paths(PathSelectors.any())//指定路径处理PathSelectors.any()代表所有的路径
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder().title("Product使⽤Swagger2构建RESTful接⼝")
//设置⽂档标题(API名称)
.description("接⼝说明")//⽂档描述
.termsOfServiceUrl("127.0.0.1:8081/")//服务条款URL
// 注意URL要和配置⽂件中的端⼝号⼀致,否则会访问不了127.0.0.1:8091/swagger-ui.html
.contact(new Contact("stephen", "127.0.0.1:8081/", "thpower@sgy"))//联系信息
.version("1.0.0")//版本号
.description("API 内容描述").build();parameter数据类型
}
}
3.Controller控制层
import com.alibaba.fastjson.JSON;
import com.stephen.shopproduct.service.ProductService;
import com.del.Product;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
slf4j.Slf4j;
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.RestController;
@RestController
@Slf4j
@Api(value = "商品接⼝功能", tags = "ProductController", description = "商品接⼝相关介绍")
public class ProductController {
@Autowired
private ProductService productService;
@ApiOperation(value = "根据商品pid查询商品信息", notes = "商品信息pid")
@ApiImplicitParam(name = "pid", value = "商品id", required = true, dataType = "Integer", paramType = "path")
@GetMapping("/product/{pid}")
public Product product(@PathVariable("pid") Integer pid) {
Product product = productService.findByPid(pid);
log.info("查询到商品:" + JSONString(product));
return product;
}
}
仔细检查发现都没有问题啊!我⼀开始猜测可能是swagger版本的问题,于是我试着再建⼀个接⼝先测试⼀下:
@ApiOperation(value = "根据商品id查询商品信息", notes = "商品信息id")
@ApiImplicitParam(name = "id", value = "商品id", required = true, dataType = "String", paramType = "path")
@GetMapping("/prod/{id}")
public Product product(@PathVariable("id") String id) {
Product product = new Product();
product.setPid(3);
product.setPname("好东西");
product.setPprice(10.0);
product.setStock(1000);
return product;
}
接⼝测试成功!这说明依赖包和配置类都没有问题,那么就只能是这个控制层出问题了,我想到两个⽅向:
1.接⼝上的swagger注解属性配置有问题.
2.swaggerUI页⾯传⼊参数的格式有问题.
通过⽹上查询的资料我发现:测试接⼝传⼊参数的时候基本上都是直接输⼊值即可,因此排除了 "2.swaggerUI页⾯传⼊参数的格式有问题." 这个原因.
那就只剩下第⼀个原因了:swagger注解属性配置有问题; 于是我⼜看了⼀遍接⼝的注解配置: @ApiOperation 和 @ApiImplicitParam
@ApiOperation(value = "根据商品pid查询商品信息", notes = "商品信息pid")
@ApiImplicitParam(name = "pid", value = "商品id", required = true, dataType = "Integer", paramType = "path")
@GetMapping("/product/{pid}")
public Product product(@PathVariable("pid") Integer pid) {
Product product = productService.findByPid(pid);
log.info("查询到商品:" + JSONString(product));
return product;
}
@ApiOperation(value = "根据商品id查询商品信息", notes = "商品信息id")
@ApiImplicitParam(name = "id", value = "商品id", required = true, dataType = "String", paramType = "path")
@GetMapping("/prod/{id}")
public Product product(@PathVariable("id") String id) {
Product product = new Product();
product.setPid(3);
product.setPname("好东西");
product.setPprice(10.0);
product.setStock(1000);
return product;
}
看了半天也没看出有什么问题:上⾯的接⼝测试时传⼊参数失败,⽽下⾯的接⼝却能成功!
这两个接⼝唯⼀的有效区别就是参数的类型了!但是查看了⼀下两个接⼝的dataType和接⼝参数的数据
类型是⼀样的!尽管我知道⼀定是参数配置出了问题,但就是不知道问题在哪⾥!就在我百思不得其解,⽹上⼜不到答案的情况下,
我想着如果不指定参数类型会怎么样呢?于是把dataType属性去掉,发现成功了:
但是有⼀个细节,可能很多⼈没有注意到,接⼝的参数类型显⽰是错的(并不是Integer):
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论