手写Api文档的几个痛点:
Swagger也就是为了解决这个问题,当然也不能说Swagger就一定是完美的,当然也有缺点,最明显的就是代码移入性比较强。
其他的不多说,想要了解Swagger的,可以去Swagger官网,可以直接使用Swagger editor编写接口文档,当然我们这里讲解的是SpringBoot整合Swagger2,直接生成接口文档的方式。
io.springfox
springfox-swagger2
2.9.2
io.springfox
springfox-swagger-ui
2.9.2
package com.ws.soon.config;
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;
/**
* @desc 自动生成接口文档
* @url http://localhost:8023/swagger-ui.html
* @author wangsaisoon
* @date 2020年1月2日 下午1:54:41
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
// 为当前包路径
.apis(RequestHandlerSelectors.basePackage("com.ws.soon.controller"))
.paths(PathSelectors.any())
.build();
// return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)).build();
}
// 构建 api文档的详细信息函数,注意这里的注解引用的是哪个
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
// 页面标题
.title("Spring Boot 使用 Swagger2 构建RESTful API")
// 创建人
.contact(new Contact("Bryan", "http://www.wangsaisoon.com/", ""))
// 版本号
.version("1.0")
// 描述
.description("API 描述")
.build();
}
}
其实这个配置类,只要了解具体能配置哪些东西就好了,毕竟这个东西配置一次之后就不用再动了。 特别要注意的是里面配置了api文件也就是controller包的路径,不然生成的文档扫描不到接口。
Application.class 加上注解@EnableSwagger2 表示开启Swagger
package com.ws.soon;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@EnableSwagger2
@SpringBootApplication
@MapperScan("com.ws.soon.mapper")
public class App
{
public static void main( String[] args )
{
SpringApplication.run(App.class, args);
}
}
swagger通过注解表明该接口会生成文档,包括接口名、请求方法、参数、返回信息的等等。
package com.ws.soon.controller;
import java.util.List;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.ws.soon.base.BaseController;
import com.ws.soon.base.DataRow;
import com.ws.soon.base.ResultVO;
import com.ws.soon.controller.dto.UserInfoDTO;
import com.ws.soon.entity.UserInfo;
import com.ws.soon.service.UserInfoService;
import lombok.extern.slf4j.Slf4j;
/**
* @author wangsaisoon
* @desc 用户信息
* @date 2019年12月6日 上午8:36:09
*/
@Slf4j
@Api(value = "用户基本信息接口")
@RequestMapping("/user/info")
@RestController
public class UserInfoController extends BaseController {
@Autowired
private UserInfoService userInfoService;
@ApiOperation(value = "保存用户")
@ApiImplicitParams({
@ApiImplicitParam(name = "userName", value = "用户名", required = true, dataType = "String"),
@ApiImplicitParam(name = "eMail", value = "邮箱", required = true, dataType = "String"),
@ApiImplicitParam(name = "remarks", value = "备注", required = true, dataType = "String")
})
// @ApiImplicitParam(name = "dto", value = "用户对象", dataType = "com.ws.soon.controller.dto.UserInfoDTO")
@PostMapping
public ResultVO save(UserInfoDTO dto) {
log.info("dto={}", dto);
UserInfo userInfo = new UserInfo();
BeanUtils.copyProperties(dto, userInfo);
log.info("userInfo={}", userInfo);
int result = userInfoService.save(userInfo);
if (result == 1) {
return ResultVO.success();
}
return ResultVO.error();
}
@ApiOperation(value = "查询所有")
@GetMapping
public ResultVO findAll() {
List list = userInfoService.findAll();
log.info("list={}", list);
// 出参
ResultVO resultVO = new ResultVO();
resultVO.setResult(list);
return resultVO;
}
@ApiOperation(value = "通过id查询")
@GetMapping("/{userId}")
public ResultVO findById(@PathVariable(value = "userId", required = true) Integer userId) {
log.info("userId={}", userId);
UserInfo userInfo = userInfoService.findById(userId);
log.info("userInfo={}", userInfo);
// 出参
ResultVO resultVO = new ResultVO();
DataRow dataRow = this.getDataRow();
dataRow.set("user_id", userInfo.getUserId());
dataRow.set("user_name", userInfo.getUserName());
dataRow.set("e_mail", userInfo.getEMail());
dataRow.set("remarks", userInfo.getRemarks());
// resultVO.setResult(userInfo);
resultVO.setResult(dataRow);
return resultVO;
}
/*@ApiImplicitParams({
@ApiImplicitParam(name = "userId", value = "用户id", required = true, dataType = "Integer"),
@ApiImplicitParam(name = "userName", value = "用户名", required = true, dataType = "String"),
@ApiImplicitParam(name = "eMail", value = "邮箱", required = true, dataType = "String"),
@ApiImplicitParam(name = "remarks", value = "备注", required = true, dataType = "String")
})*/
@ApiOperation(value = "修改", notes="通过id更新用户信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "userId", value = "用户id", required = true, dataType = "Integer", paramType = "path"),
@ApiImplicitParam(name = "dto", value = "用户对象", required = true, dataType = "UserInfo")
})
@PutMapping("/{userId}")
public ResultVO updateById(@PathVariable(value = "userId", required = true) Integer userId, UserInfo dto) {
log.info("dto={}", dto);
UserInfo userInfo = new UserInfo();
BeanUtils.copyProperties(dto, userInfo);
log.info("userInfo={}", userInfo);
int result = userInfoService.updateById(userInfo);
if (result == 1) {
return ResultVO.success();
}
return ResultVO.error();
}
@ApiOperation(value = "通过id删除")
@DeleteMapping("/{userId}")
public ResultVO deleteById(@PathVariable(value = "userId", required = true) Integer userId) {
log.info("userId={}", userId);
int result = userInfoService.deleteById(userId);
if (result == 1) {
return ResultVO.success();
}
return ResultVO.error();
}
}
启动SpringBoot项目,访问 http://localhost:8023/swagger-ui.html