swagger-ui页面接口的入参出参与代码实体类不一致有差异
后端开发,在进行后端接口开发时,会用到swagger进行接口管理。
路径:http://local:8080/xxx/swagger-ui.html
但是在swagger-ui页面,查看接口时,发现
入参出参列表
与
自己开发的
接口出入参实体类
不一样
。
碰到这个问题,很多人第一反应,以为是 浏览器缓存,客户端缓存等导致的,其实不是的,真正原因是开发人员定义的实体类的api model名导致的。
比如工程中有两个实体类,这两个实体类是完全不一样的,只是ApiModel命名一样。
如下两个实体类
PerionInfo.java
是你的接口用的入参实体类
CarInfo.java
是工程里已有的实体类
但是由于两个实体类都叫同一个名:
@ApiModel(“查询详细信息入参”)
所以就导致了,你的接口swagger-ui展示成了其他的实体类参数了。
@ApiModel("查询详细信息入参")
public class PerionInfo implements Serializable{
private static final long seriUID = -1L;
@ApiModelProperty("姓名")
private String name;
@ApiModelProperty("性别")
private String sex;
@ApiModelProperty("生日")
private String birday;
@ApiModel("查询详细信息入参")
public class CarInfo implements Serializable{
private static final long seriUID = -1L;
@ApiModelProperty("车名")
private String name;
@ApiModelProperty("颜色")
private String col;
- 在抄别人代码的时候,一定要注意不能硬抄,关键位置代码一定要改
- swagger 管理接口比较常见,开发人员需要用心维护好
- 这个坑,有缘人就不要再踩了
把最近项目中遇到的问题跟大家分享下:最近做了一个项目,后端接口写好后和pc端vue联调完毕,业务还需要和App端[ios,andro]对接,问题来了,后端接口中的入参和出参都是Java数据类型[Date,Boolean,Integer,Long等]的,当初这样定义的确是为了方便后端接口代码处理比较方便,但App端要求后端接口字段不能返回null值,不然页面报错,渲染不出来。
解决...
Swagger2接口参数实体类字段自定义
使用swagger文档的时候发现实体类参数每次都是全部显示出来,导致和前端对接很麻烦,就产生了想要自定义的实体类参数的想法,于是在百度了很久,找到了flymoringbird大神的文章Swagger2 自定义注解 :解决一个简单的model类 适用于controller的多个方法,参考了一下发现只能实现body传参,query传参还是没有办法实现,于是又开始了百度,找到了x-easy大神swagger2 同一个实体用在多个不同的controller接口展示不同的字段
@ApiOperation(value = "删除用户", notes = "根据用户名删除指定用户", httpMethod = "POST")
@ApiImplicitParam(
name = "username", value = "用户的用户名", required = true, dataType="String"
@ApiResponses({...
浅谈Swagger注解@Api@ApiOperation@ApiImplicitParams 和 @ApiImplicitParam@ApiParam@ApiModel和@ApiModelProperty
使用场景:在 Rest 接口类上边使用。
标记类为 Swagger 资源类,运行时有效。
Api 用在类上,说明该类的作用。可以标记一个Controller类做为swagger 文档资源,使用方式:
@Api(value = "/user", description = "Operatio
直接传入这个格式的字符串,服务端会报错
Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.time.LocalDateTime` from String "2021-11-24T08:41:36.357Z": Failed to deser
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNu...
这个错误大部分时候不会影响正常使用,但也有的时候会导致无法传参测试。
此处的问题主要原因是Swagger找不到你自己定义的实体类信息。所以你需要添加一个接口让Swagger能够找到你的实体类信息,这个时候需要加一个识别的接口。
@RestController
public class SwaggerController...
这时再去看就只有这两个参数了,可是问题又来了,我现在前端要传一堆参数过来,当然里面全是实体类StudentEntity的参数,但是Entity中的部分参数,又没有我们怎么办呢?
定义接口的时候,发现进入swagger ui显示接口的入参参数和我代码中的不一致?
并且两个接口的入参显示一样,但是实际上我代码中引用的是两个入参对象的。不一样的参数。
起初以为是浏览器缓存、服务器缓存,都clean了,还是一样。怎么回事?
先把代码贴出来。看看
很明显,是两个不一样的接口,两个入参对象,下图为两个入参对象的数据结构。
很明显,两个不一样的对象,但是为什么引用了同一个入参对象呢?????
仔细一端详,哦。。。。。。@ApiModel配置了同一个名字,也就是说,按照顺序来说,两个.
swagger的配置和用法,在此就不做过多赘述了,在使用过程中,可能有的朋友会遇到这样的情况,这个接口显示的示例参数,却是另一个接口的参数格式,这个对后端自测的角度来说,非常不友好。但只要把参数手动改成正确的格式,后端接口还是能正确接收的。
我们习惯使用DTO作为接口的入参,一个DTO对象往往需要标注@ApiModel注解,我们从原备注信息能够获得该注解的详情。
能够针对我们的接口入参对象提供额外的信息,也就是能够根据后端入参的数据接口,显示一个可测试的数据对象,一个json格式的对象。
而出现这个接口.