参考:https://blog.csdn.net/bbxylqf126com/article/details/109646966
1、加与依赖:pom
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
2、配置其配置类:
package com.example.dtest.javaBeanAppContext.swaggerConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
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;
/*
* 参考:https://blog.csdn.net/bbxylqf126com/article/details/109646966
* */
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket docket() {
// 设置要显示swagger的环境
// 通过 enable() 接收此参数判断是否要显示
return new Docket(DocumentationType.SWAGGER_2)
// 指定构建api文档的详细信息的方法:apiInfo()
.apiInfo(apiInfo())
// .enable(false) //配置是否启用Swagger,如果是false,在浏览器将无法访问
.select()// 通过.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口
// 指定要生成api接口的包路径,这里把controller作为包路径,生成controller中的所有接口
.apis(RequestHandlerSelectors.basePackage("com.example.dtest.controller"))
//配置你想在那个controller层生产接口文档
// .paths(PathSelectors.ant("/search/**"))
// 配置如何通过path过滤,即这里只扫描请求以/kuang开头的接口
.build();
}
//配置文档信息
private ApiInfo apiInfo() {
/*第一种写法*/
// Contact contact = new Contact("沉默这忍受", "https://blog.csdn.net/ILOVEMYDEAR", "hjj2857154359@126.com");
// return new ApiInfo(
// // 设置页面标题
// "Cartest", // 标题
// "索引测试管理api", // 描述
// "v1.0", // 版本
// "https://blog.csdn.net/ILOVEMYDEAR", // 组织链接
// contact, // 联系人信息
// "Apach 2.0 许可", // 许可
// "许可链接", // 许可连接
// new ArrayList<>()// 扩展
// );
// }
/*第二种写法*/
return new ApiInfoBuilder()
// 设置页面标题
.title("超级无敌大系统")
// 设置接口描述
.description("借口描述:666")
// 设置联系方式
.contact(new Contact("DCS", null, "xxxxxxx@xxx.com"))
// 设置版本
.version("1.0")
.build();
}
}
3、访问网页:
启动应用
应用启动后,访问swagger-ui页面:http://localhost:9999/swagger-ui.html
这里有个坑:swagger无法传递多文件类型
swagger测试MultipartFile多文件上传,files取不到
解决:
参考:https://blog.csdn.net/qq_43470725/article/details/121406156
package com.example.dtest.controller;
import com.example.vo.Res;
import com.example.vo.TestVO;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
@RestController
@RequestMapping("/file")
@CrossOrigin
public class FileController {
@PostMapping("/insertFile")
@ApiOperation(value = "swagger用来对接口的说明",notes = "swagger用来对接口的详细描述")
@ApiImplicitParams(
{
@ApiImplicitParam(name = "id",value = "用户id",dataType = "Integer",defaultValue = "1"),
@ApiImplicitParam(name = "nickName",value = "小名",dataType = "String",defaultValue = "1")
}
)
public Res insertFile(
@RequestParam("name") String name,
@RequestParam("nickName") String nickName,
@RequestParam("type") String type,
@RequestParam("file") MultipartFile[] multipartFiles
){
System.out.println("11111111111111");
System.out.println("multipartFiles========"+multipartFiles);
for(MultipartFile multipartFile : multipartFiles){
String originalFilename = multipartFile.getOriginalFilename();
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
System.out.println("suffix========="+suffix);
System.out.println("originalFilename======="+originalFilename);
try {
InputStream inputStream = multipartFile.getInputStream();
FileInputStream fileInputStream = (FileInputStream)inputStream;
FileOutputStream fileOutputStream = new FileOutputStream("D:\\3.jpg");
byte[] bytes = new byte[1024];
int len;
while ((len = fileInputStream.read(bytes)) != -1){
fileOutputStream.write(bytes, 0, len);
fileOutputStream.flush();
}
fileInputStream.close();
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return Res.success();
}
@PostMapping("/insertFile02")
public Res insertFile02(
TestVO testVO,
MultipartFile[] multipartFiles
){
System.out.println("11111111111111");
System.out.println("multipartFiles========"+multipartFiles);
for(MultipartFile multipartFile : multipartFiles){
String originalFilename = multipartFile.getOriginalFilename();
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
System.out.println("suffix========="+suffix);
System.out.println("originalFilename======="+originalFilename);
try {
InputStream inputStream = multipartFile.getInputStream();
FileInputStream fileInputStream = (FileInputStream)inputStream;
FileOutputStream fileOutputStream = new FileOutputStream("D:\\3.jpg");
byte[] bytes = new byte[1024];
int len;
while ((len = fileInputStream.read(bytes)) != -1){
fileOutputStream.write(bytes, 0, len);
fileOutputStream.flush();
}
fileInputStream.close();
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println(testVO);
return Res.success(testVO);
}
}
swagger2.x的使用
上面我们已经配置好了swagger2,并且也启动测试了一下,功能正常,下面我们开始使用swagger2。swagger2的使用主要是他的注解的使用,swagger2的注解可以分为两大类:controller(类)注解、方法注解;方法注解又包括了修饰方法的注解、修饰方法参数的注解以及修饰方法返回值的注解
@Api – Controller注解
顾名思义,该注解主要作用在类上,用来描述类或者接口的作用
@ApiOperation – 方法注解
该注解主要是作用在方法上,用来说明该方法的作用,他有两个参数值得注意
value: 用来对接口的说明
notes:用来对接口的详细描述
@ApiImplicitParams – 参数注解
作用在方法上,用来对接口的中参数进行说明
@ApiResponses – 返回值注解
作用在方法上,用来对接口的返回值进行说明,表示一组响应
代码演示:
package com.example.dtest.controller;
import com.example.jsontoobject.CaseDTO;
import com.example.jsontoobject.JsonChange;
import com.example.jsontoobject.TaskDetailDTO;
import com.example.vo.Res;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import io.swagger.annotations.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/test000")
@Api(tags = "swagger描述类或者接口")
public class TestController {
@ApiOperation(value = "swagger用来对接口的说明",notes = "swagger用来对接口的详细描述")
@ApiImplicitParams(
{
@ApiImplicitParam(name = "taskDetailDTO",value = "swagger解释参数的",dataType = "TaskDetailDTO",defaultValue = "1")
}
)
@ApiResponses({
@ApiResponse(code = 400, message = "参数错误"),
@ApiResponse(code = 404, message = "请求路径不正确")
})
@PostMapping("/start")
public Res test(@RequestBody TaskDetailDTO taskDetailDTO){
System.out.println("taskDetailDTO======="+taskDetailDTO);
System.out.println("caseId======"+taskDetailDTO.getTaskDetail().get(0));
List taskDetails = taskDetailDTO.getTaskDetail();
System.out.println("taskDetails======="+taskDetails);
List<CaseDTO> cases = new ArrayList<>();
try {
cases = JsonChange.listToObject(taskDetails, new TypeReference<List<CaseDTO>>() {
});
} catch (JsonProcessingException e) {
e.printStackTrace();
}
System.out.println("cases==========="+cases);
System.out.println("caseId======"+cases.get(0).getCaseId());
return Res.success(cases);
}
}