springboot+Swagger2构建API文档

Easter79
• 阅读 731

Swagger2笔记

配置

很简单,如下所示:

@Configuration
@EnableSwagger2
public class SwaggerConfig {

  @Bean
  public Docket createRestApi(){
    return new Docket(DocumentationType.SWAGGER_2)
      .apiInfo(apiInfo())
      .select()
      .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
      .paths(PathSelectors.any())
      .build();
  }

  private ApiInfo apiInfo(){
    return new ApiInfoBuilder().title("doris-alarm-service")
      .description("告警服务API")
      .termsOfServiceUrl("http://192.168.7.56/")
      .contact(new Contact("王用军","","wangyongjun@sunseaiot.com"))
      .version("0.1")
      .build();
  }

}

使用

@RestController
@Api(tags = {"告警输入API"})
public class AlarmInputController {

  @Autowired
  private AlarmService alarmService;

  @PostMapping(value = "/alarm")
  @ApiOperation(value = "创建一个告警",notes = "向服务器发送一个告警")
  @ApiImplicitParams(@ApiImplicitParam(name = "alarmCreate",value = "创建告警信息实体", required = true,dataType = "AlarmCreate",paramType = "body"))
  public ResponseEntity<Alarm> createAlarm(
   @RequestBody AlarmCreate alarmCreate
  ){
    return new ResponseEntity<>(alarmService.createAlarm(alarmCreate), HttpStatus.CREATED);
  }

}

/**
 * 根据告警信息uuid获取告警信息
 * @param uuid
 * @return
 */
@GetMapping(value = "/alarm/{uuid}")
@ApiOperation(value = "根据uuid获取一条告警",notes = "通过uuid获取一条告警信息")
@ApiImplicitParams(@ApiImplicitParam(name = "uuid",value = "告警信息编号",required = true,dataType = "Long",paramType = "path"))
public ResponseEntity<Alarm> getByLevel(@PathVariable(value = "uuid") Long uuid){
  if(uuid == null){
    ResponseEntity.badRequest().body(Result.failure401().msg("参数uuid不能为null"));
  }
  return new ResponseEntity<>(alarmService.getAlarmByUuid(uuid), HttpStatus.OK);
}

/**
 * 多条告警信息
 */
@GetMapping(value = "/alarms")
@ApiOperation(value = "根据条件获取多条告警",notes = "通过条件获取多条告警信息")
@ApiImplicitParams({
  @ApiImplicitParam(name = "serialNum", value = "设备对告警信息的编号", required = false, dataType = "string",paramType = "query"),
  @ApiImplicitParam(name = "name", value = "告警名称", required = false, dataType = "string",paramType = "query"),
  @ApiImplicitParam(name = "value", value = "告警值", required = false, dataType = "string",paramType = "query"),
  @ApiImplicitParam(name = "dsn", value = "告警设备DSN", required = false, dataType = "string",paramType = "query"),
  @ApiImplicitParam(name = "level", value = "告警级别,WARN,SERIOUS,ERROR", required = false, dataType = "string",paramType = "query"),
  @ApiImplicitParam(name = "alarmTimeStart", value = "设备告警时间范围开始", required = false,dataType = "long",paramType = "query"),
  @ApiImplicitParam(name = "alarmTimeEnd", value = "设备告警时间范围结束", required = false, dataType = "long",paramType = "query"),
})
public ResponseEntity<List<Alarm>> getAlarms(@ApiIgnore AlarmSearch alarmSearch){

  return new ResponseEntity<>(alarmService.getAlarms(alarmSearch),HttpStatus.OK);
}

@ApiModel
public class AlarmCreate implements Serializable {

  private String serialNum;  //设备对告警信息的编号
  @ApiModelProperty(value = "告警名称",dataType = "string",required = true)
  private String name;  //告警名称
  @ApiModelProperty(value = "告警值",dataType = "string",required = true)
  private String value;  //告警值
  @ApiModelProperty(value = "告警设备DSN",dataType = "string",required = true)
  private String dsn;  //告警设备DSN
  @ApiModelProperty(value = "告警等级",dataType = "string",required = true)
  private String level; //告警级别,WARN,SERIOUS,ERROR
  @ApiModelProperty(value = "设备告警时间",dataType = "long",required = true)
  private Long alarmTime;  //设备告警时间
  
  //...
}

说明

  1. @Api(tags = "告警信息输出API")用在controller上,注解中还有produces、consumes、protocols、authorizations、hidden基本用不上,可按需使用。
  2. @ApiOperation,用在方法上,value-api名称,notes-api说明,其余属性一般都不用写。
  3. @ApiImplicitParams、@ApiImplicitParam配合用在方法上,用来说明请求参数。
  • 建议不要用使用@ApiParam,该注解功能与@ApiImplicitParam 相同,只是使用位置不同,@ApiImplicitParam写在方法上,@ApiParam加在参数上,后者会影响代码阅读,不如前者干净整洁。
  • @ApiImplicitParam必须用在@ApiImplicitParams里面,不然不起作用
  • @ApiImplicitParam属性:name-参数名,value-参数说明,required-是否必须,dataType数据类型(对象直接写类名)、paramType-参数类型(path-路径变量,query-问号拼接查询参数串,body-请求体,header-请求头,form-表单提交),这四个参数都不是必须的,有的能自动推断,有的有默认值,但是建议都写上,因为在某些场景下,自动推断会失效。
  1. @ApiIgnore,用在参数或者方法上,忽略该方法或者参数。此处有坑:如上示例所示,我是用一个对象接收参数,用@ApiImplicitParam依次描述各个参数,这时就必须使用@ApiIgnore忽略掉你的对象参数,不然swagger会将这个对象参数也推断为使用该api需要的参数。(当然你也可以不用对象接收参数,而是直接接收各个字段参数,这样swagger对参数的推断就与你使用@ApiImplicitParam声明的参数相符了)
  2. 当我们使用@RequestBody注解接收参数时,可以使用@ApiModel和@ApiModelProperty对该参数进行一些说明(不用也可以,swagger会自己推断一些信息。但是自动推断不能判断某个属性是不是必须的,这个必须你自己指定。另外,某些场景下自动推断会出错)
  3. @ApiResponses、@ApiResponse配合用在方法上或controller上。
  • 注意,这两个注解时用来说明可能出现的错误响应的,正确的响应在@ApiOperation中说明
  • @ApiResponse必须用在@ApiResponses中,不然无效
  • 用在方法优先级高于类上的
  • @ApiResponse属性:code-http响应码,message-消息,response-响应的数据类型
  • 一般不需要使用这两个注解,因为对API来说重要的是正确的响应是什么,错误的无需特别说明。
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k