Java利用Swagger2自动生成对外接口的文档

作者:小卖铺的老爷爷 时间:2023-03-31 03:22:38 

一直以来做对外的接口文档都比较原始,基本上都是手写的文档传来传去,最近发现了一个新玩具,可以在接口上省去不少麻烦。

swagger是一款方便展示的API文档框架。它可以将接口的类型最全面的展示给对方开发人员,避免了手写文档的片面和误差行为。

swagger目前有两种swagger和swagger2两种,1比较麻烦,所以不考虑使用。本文主要记录我用swagger2做对外接口的两种方式,方面后面查阅。

一、使用传统的springmvc整合swagger2

1、maven依赖


<!--springfox依赖-->
   <dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-core</artifactId>
     <version>2.8.0</version>
   </dependency>
   <dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-databind</artifactId>
     <version>2.6.3</version>
   </dependency>
   <dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-annotations</artifactId>
     <version>2.6.3</version>
   </dependency>
   <dependency>
     <groupId>io.springfox</groupId>
     <artifactId>springfox-swagger2</artifactId>
     <version>2.4.0</version>
   </dependency>
   <dependency>
     <groupId>io.springfox</groupId>
     <artifactId>springfox-swagger-ui</artifactId>
     <version>2.4.0</version>
   </dependency>

2、spring-mvc.xml 中添加映射静态的配置(其实我项目中把这个去掉也可以,不知道什么情况):


<!-- swagger静态文件路径 -->
 <mvc:resources location="classpath:/META-INF/resources/" mapping="swagger-ui.html"/>
 <mvc:resources location="classpath:/META-INF/resources/webjars/" mapping="/webjars/**"/>

注意:基本的springmvc配置我就不贴了,需要注意的是,如果你看到swagger-ui.html 界面出来,但却一片空白,请检查下你web.xml中 * 的配置,一定要springmvc先拦截到,然后界面才会显示的。

3、然后是swagger2的配置类:


@Configuration
@EnableSwagger2
public class SwaggerConfig extends WebMvcConfigurationSupport {

@Bean
 public Docket createRestApi() {
   return new Docket(DocumentationType.SWAGGER_2)
       .apiInfo(apiInfo())
       .select()
       .apis(RequestHandlerSelectors.basePackage("net.laoyeyey.yyblog"))
       .paths(PathSelectors.any())
       .build();
 }

private ApiInfo apiInfo() {
   return new ApiInfoBuilder()
       .title("yyblog项目 RESTful APIs")
       .description("yyblog项目api接口文档")
       .version("1.0")
       .build();
 }
}

注意:paths如果在生产情况下可以调整为PathSelectors.none(),即不显示所有接口信息;

4、接口信息配置

即在SpringMvc的Controller中配置相关的接口信息


@Controller
@RequestMapping(value = "aitou")
@Api(description = "测试服务-账户信息查询")
public class DailyOperationDataController {
 Logger      logger  = Logger.getLogger(DailyOperationDataController.class);
 @Autowired
 private DailyOperationDataService DailyOperationDataService;
 /*
  * @ApiOperation(value = "接口说明", httpMethod ="接口请求方式", response ="接口返回参数类型", notes ="接口发布说明"
  * @ApiParam(required = "是否必须参数", name ="参数名称", value ="参数具体描述"
*/
 @ApiOperation(value = "账户信息查询接口")
 @RequestMapping(method ={RequestMethod.POST,RequestMethod.GET}, value="/query/dailydata/{dataDate}")
 @ResponseBody
 public DailyOperationDataDto getDailyReportByDataDate(@PathVariable("dataDate") String dataDate) {
   try {
     return DailyOperationDataService.getDailyReportByDataDate(dataDate);
   } catch (Exception e) {
     logger.error(e.getMessage(), e);
   }

return null;
 }

}

注:通常情况下swagger2会将扫描包下所有的接口展示出来,这里我是对外的接口是单独一个包,避免展示过多的接口,当然接口方法也可以让它不展示。可以在下面看到相关的注解中有写。

常用的一些注解

@Api:用在类上,说明该类的作用
@ApiOperation:用在方法上,说明方法的作用
@ApiImplicitParams:用在方法上包含一组参数说明
@ApiImplicitParam:用在 @ApiImplicitParams 注解中,指定一个请求参数的各个方面
paramType:参数放在哪个地方
· header --> 请求参数的获取:@RequestHeader
· query -->请求参数的获取:@RequestParam
· path(用于restful接口)--> 请求参数的获取:@PathVariable
· body(不常用)
· form(不常用)
name:参数名
dataType:参数类型
required:参数是否必须传
value:参数的意思
defaultValue:参数的默认值
@ApiResponses:用于表示一组响应
@ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息
code:数字,例如400
message:信息,例如"请求参数没填好"
response:抛出异常的类
@ApiParam:单个参数描述
@ApiModel:描述一个Model的信息,用对象来接收参数(这种一般用在post创建的时候,使用@RequestBody这样的场景,请求参数无法使用@ApiImplicitParam注解进行描述的时候)
@ApiModelProperty:描述一个model的属性
@ApiProperty:用对象接收参数时,描述对象的一个字段
@ApiIgnore:使用该注解忽略这个API

基本上就是上面这些了,是不是很easy,下面看下效果图

Java利用Swagger2自动生成对外接口的文档

Java利用Swagger2自动生成对外接口的文档

二、使用springboot整合swagger2

上面说了使用传统的springmvc整合swagger2,在说说最近比较流行的springboot的方式,其实原理都是一样的。

1、maven依赖


<!--springfox依赖 -->
   <dependency>
     <groupId>io.springfox</groupId>
     <artifactId>springfox-swagger2</artifactId>
     <version>2.7.0</version>
   </dependency>
   <dependency>
     <groupId>io.springfox</groupId>
     <artifactId>springfox-swagger-ui</artifactId>
     <version>2.7.0</version>
   </dependency>

这个是我最近用springboot写的个人项目中的内用,版本用的2.7.0

2、添加静态资源配置


@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {/**
  * 配置静态资源路径以及上传文件的路径
  *
  * @param registry
  */
 @Override
 public void addResourceHandlers(ResourceHandlerRegistry registry) {
   registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
   registry.addResourceHandler("/upload/**").addResourceLocations(environment.getProperty("spring.resources.static-locations"));
   /*swagger-ui*/
   registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
   registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
 }

}

其实就是最后两句,如果你不配置这个的话,访问swagger-ui.html会出现500,还是404的错误来着,记不清了,应该是404.

3、swagger2的配置类

和上面一样,基本上没区别


@Configuration
@EnableSwagger2
@EnableWebMvc
public class SwaggerConfig extends WebMvcConfigurationSupport {

@Bean
 public Docket createRestApi() {
   return new Docket(DocumentationType.SWAGGER_2)
       .apiInfo(apiInfo())
       .select()
       .apis(RequestHandlerSelectors.basePackage("net.laoyeye.yyblog.web.frontend"))
       .paths(PathSelectors.none())
       .build();
 }

private ApiInfo apiInfo() {
   return new ApiInfoBuilder()
       .title("yyblog项目 RESTful APIs")
       .description("yyblog项目api接口文档")
       .version("1.0")
       .build();
 }

}

注意,我上面有说path的问题哦,直接拷贝不显示api的,(#^.^#)

4、接口的配置


/**
* 前台文章Controller
* @author 小卖铺的老爷爷
* @date 2018年5月5日
* @website www.laoyeye.net
*/
@Api(description="文章查询")
@Controller
@RequestMapping("/article")
public class ArticleController {
 @Autowired
 private ArticleService articleService;
 @Autowired
 private SettingService settingService;
 @Autowired
 private CateService cateService;
 @Autowired
 private TagReferService tagReferService;
 @Autowired
 private UserService userService;
 @Autowired
 private ArticleMapper articleMapper;
 @Autowired
 private CommentService commentService;

@ApiOperation(value="文章查询接口")
 @ApiImplicitParam(name = "id", value = "文章ID", required = true, dataType = "Long")
 @GetMapping("/{id}")
 public String index(Model model, @PathVariable("id") Long id) {
   try {
     articleService.updateViewsById(id);
   } catch (Exception ignore) {
   }
   List<Setting> settings = settingService.listAll();
   Map<String,Object> map = new HashMap<String,Object>();
   for (Setting setting : settings) {
     map.put(setting.getCode(), setting.getValue());
   }
   Article article = articleService.getArticleById(id);
   model.addAttribute("settings", map);
   model.addAttribute("cateList", cateService.listAllCate());
   model.addAttribute("article", article);
   model.addAttribute("tags", tagReferService.listNameByArticleId(article.getId()));
   model.addAttribute("author", userService.getNicknameById(article.getAuthorId()));
   //回头改
   model.addAttribute("articles", articleMapper.listArticleByTitle(null));
   model.addAttribute("similars", articleMapper.listArticleByTitle(null));
   CommentQuery query = new CommentQuery();
   query.setLimit(10);
   query.setPage(1);
   query.setArticleId(id);
   model.addAttribute("comments", commentService.listCommentByArticleId(query));
   return "frontend/article";
 }

@ApiOperation(value="文章评论查询接口")
 @PostMapping("/comments")
 @ResponseBody
 public DataGridResult comments(CommentQuery query) {
   //设置默认10
   query.setLimit(10);
   return commentService.listCommentByArticleId(query);
 }

@ApiOperation(value="文章点赞接口")
 @ApiImplicitParam(name = "articleId", value = "文章ID", required = true, dataType = "Long")
 @PostMapping("/approve")
 @ResponseBody
 public YYBlogResult approve(@RequestParam Long articleId) {
   return articleService.updateApproveCntById(articleId);
 }
}

最后同样来个效果图,和上面一样。

PathSelectors.none()的时候

Java利用Swagger2自动生成对外接口的文档

PathSelectors.any()的时候

Java利用Swagger2自动生成对外接口的文档

Java利用Swagger2自动生成对外接口的文档

看到效果图是不是接口内容一目了然,很简洁明了了。

最后,好像忘记说swagger文档的路径了

如果你的项目在根目录:http://localhost:8080/swagger-ui.html

如果不是根目录那就是:http://localhost:8080/你的项目名/swagger-ui.html

来源:http://www.cnblogs.com/laoyeye/p/9047504.html

标签:Java,Swagger2,接口文档
0
投稿

猜你喜欢

  • Java中包装类介绍与其注意事项

    2023-03-20 18:26:36
  • mybatis拦截器与分页插件实例教程

    2021-11-16 15:41:48
  • Java中instanceof关键字的用法总结

    2022-12-11 15:52:27
  • C语言与C++中关于字符串使用的比较

    2022-01-22 01:30:37
  • 老生常谈 Java中的继承(必看)

    2023-06-21 11:59:51
  • Java并发之嵌套管程锁死详解

    2023-01-13 10:55:01
  • Java创建树形结构算法实例代码

    2021-11-21 22:24:01
  • Struts2+uploadify多文件上传实例

    2023-03-19 07:53:35
  • Java实现学生成绩输出到磁盘文件的方法详解

    2021-11-08 05:24:51
  • C++之异常处理详解

    2023-04-10 10:22:00
  • java线程并发控制同步工具CountDownLatch

    2022-09-02 12:18:06
  • Android实现图片自动轮播并且支持手势左右无限滑动

    2021-11-04 22:56:46
  • java利用url实现网页内容的抓取

    2023-05-14 11:10:21
  • 解析C#中委托的同步调用与异步调用(实例详解)

    2022-12-24 19:06:47
  • Andriod使用多线程实现轮播图片

    2023-07-27 15:47:31
  • 基于Java swing组件实现简易计算器

    2023-03-29 02:10:07
  • 高并发下restTemplate的错误分析方式

    2023-08-23 12:58:24
  • JAVA 静态代理模式详解及实例应用

    2021-10-20 05:39:00
  • C#计算两个文件的相对目录算法的实例代码

    2022-08-27 10:27:44
  • JAVA Map架构和API介绍

    2023-01-25 14:01:38
  • asp之家 软件编程 m.aspxhome.com