相关文章推荐
严肃的香槟  ·  intl扩展 mac ...·  1 年前    · 
难过的打火机  ·  UNSUPPORTED_SUBQUERY_E ...·  1 年前    · 

问题现象:

今天在学习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 org.springframework.context.annotation.Bean;
import org.springframework.context.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("${swagger.enabled}")
	private boolean enableSwagger;
	@Bean
	public Docket createRestApi() {
		return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()) //信息会在页面上展示
				.enable(enableSwagger)//是否开启 (true 开启  false隐藏。生产环境建议隐藏)
				.select().apis(RequestHandlerSelectors.basePackage("com.stephen.shopproduct.controller"))//扫描的路径包,设置basePackage会将包下的所有被@Api标记类的所有方法作为api
				.paths(PathSelectors.any())//指定路径处理PathSelectors.any()代表所有的路径
				.build();
	private ApiInfo apiInfo() {
		return new ApiInfoBuilder().title("Product使用Swagger2构建RESTful接口")
				//设置文档标题(API名称)
				.description("接口说明")//文档描述
				.termsOfServiceUrl("http://127.0.0.1:8081/")//服务条款URL
				// 注意URL要和配置文件中的端口号一致,否则会访问不了http://127.0.0.1:8091/swagger-ui.html
				.contact(new Contact("stephen", "http://127.0.0.1:8081/", "thpower@sgy.com"))//联系信息
				.version("1.0.0")//版本号
				.description("API 内容描述").build();

3.Controller控制层

import com.alibaba.fastjson.JSON;
import com.stephen.shopproduct.service.ProductService;
import com.stephen.shopcommon.model.Product;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.extern.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("查询到商品:" + JSON.toJSONString(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("查询到商品:" + JSON.toJSONString(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):

这里显示的是string类型,这说明当不指定dataType的时候,默认是传入String类型的参数,

但不知道为什么会自动检测并匹配了接口参数类型?得看看源码才知道了!

这个问题要是有知情的小伙伴请一定在评论区留下你的精彩评论,感谢.

后来突发奇想: 如果参数类型是Integer,那对应的dataType有没有可能是int?

结果真的如我所料,修改之后接口测试成功了(神奇):

而且接口的参数类型显示是对的(integer):

虽然解决了问题,但我还是建议swagger官方可以解决这个bug,让dataType和参数类型对应起来,Integer就应该对应Integer,int对应int,毕竟学过java的都知道这两者不是同一类型的,不然很容易混淆!!!!!!

解决方法:

    @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("查询到商品:" + JSON.toJSONString(product));
		return product;

@ApiImplicitParam 中 dataType 的值 Integer 修改为 int:

    @ApiOperation(value = "根据商品pid查询商品信息", notes = "商品信息pid")
	@ApiImplicitParam(name = "pid", value = "商品id", required = true, dataType = "int", paramType = "path")
	@GetMapping("/product/{pid}")
	public Product product(@PathVariable("pid") Integer pid) {
		Product product = productService.findByPid(pid);
		log.info("查询到商品:" + JSON.toJSONString(product));
		return product;
                    问题现象:今天在学习swagger做接口api说明的时候,出现了一个一直解决不了的问题,而且网上搜了很久,都找不到任何相似的问题和解决方法:当用swagger测试一个需要传入(Integer数据类型)参数的接口时,一直是显示红框状态,不能被execute(执行),没有任何错误提示!问题分析:于是我就通过以下几个方面去查看问题所在:1.swagger依赖:(没问题)        &lt;!--swaggerUI--&gt;        &lt;dependency&gt;
				
前后端分离,前端对接口都需要有接口文档,根据接口文档写接口方法,看文档还要去写接口方法基本都是粘贴复制,把这个机械的任务解除了 我们可以根据swagger接口文档,前端来自动生成接口方法 根据swagger.json文件来npm 生成接口方法 接口信息都截去了 原创文章 60获赞 17访问量 21万+
@ApiOperation(value = "分页查看用户列表",notes = "分页查看用户列表") @ApiImplicitParams({ @ApiImplicitParam(paramType = "query", name = "pageNum", value = "当前页码",required = true), @Api...
1.要想使用swagger需要先在项目中进行配置: 以下代码的意思可以通过在专门的php文件中写入,然后再更新版本的候可以直接更改该文件下的版本号,以及可以在这里直接增加一些必须的参数,这里的必须参数以签名、间戳、用户id为例; * @SWG\Info( * title="她face+ API接口文档", * version="4.0.0" * @SWG...
2020-11-04 10:50:46,383 [http-nio-9292-exec-3] WARN i.s.m.parameters.AbstractSerializableParameter:421 - Illegal DefaultValue null for parameter type integer java.lang.Number
Swagger是一个API开发者的工具框架,用于生成、描述、调用和可视化RESTful风格的Web服务。总体目标是使客户端和文件系统服务器以同样的速度来更新,方法,参数和模型紧密集成到服务器端的代码中,允许API始终保持同步。 在使用 django-rest-framework 进行API开发,可以使用django-rest-swagger接入swagger自动生成接口文档。 1. 安装django-rest-swagger pip install django-rest-swagger 2.配置settings.py INSTALLED_APPS = [ 'rest_fram
我们在实际的开发工作中需要将django框架与swagger进行集成,用于生成API文档。网上也有一些关于django集成swagger的例子,但由于每个项目使用的依赖版本不一样,因此可能有些例子并不适合我们。我也是在实际集成过程中遇到了一些问题,例如如何自定义参数问题,最终成功集成,并将结果分享给大家。 我开发使用的依赖版本,我所使用的都是截止发稿日期为止最新的版本: Django 2.2.7 django-rest-swagger 2.2.0 djangorestframework 3.10.3 修改settings.py 1、项目引入rest_framework_swa 那,我为了在controller调用service,入参类型得一致呀, 那么问题来了,controller入参也得是List吧,或者是其他形式的数据,转换为List<Map> 翻遍了...
在web开发中需要对接口进行测试,这就需要用到测试工具。一般使用较多的测试工具有swagger(丝袜哥)和postman(邮递员)。在这里来总结一下swagger的使用方法和步骤。Swagger 官网地址:https://swagger.io/Swagger 有了丝袜哥,只需要在类或者接口等地方加上几个注解,然后在浏览器通过对应的url访问swagger的ui界面,这个界面上会展示接口的所有信息,点击对应的接口即可进行测试,非常方便,界面也做的非常赏心悦目。 Spring,迅速将Swagger规范纳入自身
如果你的 API 在运行中,你可以在浏览器中访问 `http://[your-api-domain]/swagger` 来查看 Swagger 接口文档。 例如,如果你的 API 的域名是 `api.example.com`,你可以在浏览器中访问 `http://api.example.com/swagger` 来查看 Swagger 接口文档。 如果你的 API 是本地运行的,你可以在浏览器中访问 `http://localhost:[your-api-port]/swagger` 来查看 Swagger 接口文档。 例如,如果你的 API 端口是 `8000`,你可以在浏览器中访问 `http://localhost:8000/swagger` 来查看 Swagger 接口文档。 注意,这些地址是 Swagger 接口文档的默认地址,如果你或者你的团队更改了 Swagger 接口文档的默认地址,你需要使用新的地址来访问 Swagger 接口文档。
springboot项目启动报错:Field xxxMapper in com...xxxController required a bean of type ‘com...xxxMapper‘ 32531 已解决: mybatis绑定异常:报错BindingException: Invalid bound statement (not found):com....xxxMapper 29068 已解决: mybatis绑定异常:报错BindingException: Invalid bound statement (not found):com....xxxMapper Stephen·You: 1、检查xml文件中映射的mapper接口类路径是否正确 2、检查一下mapper接口类中定义的方法名和xml文件中的是否一致 3、还解决不了的话,可以截图私发我 已解决: mybatis绑定异常:报错BindingException: Invalid bound statement (not found):com....xxxMapper RedSparks: 我的报错最后是com.xxx.service.xxx.method,请问怎么解决啊? (已解决) org.apache.ibatis.ognl.OgnlException: source is null for getProperty(null, “staffId“) Springboot获取jar包中resources资源目录下的文件 MySQL:varchar与date类型互转,对接java数据类型String和Date