From 43885b9858a4136833c621d2f7e59d67490143ec Mon Sep 17 00:00:00 2001 From: "yinyouhai@aliyun.com" Date: Fri, 23 Aug 2019 01:18:47 +0800 Subject: [PATCH] Swagger --- SpringBootSwagger2/.classpath | 38 ++++++ SpringBootSwagger2/.project | 34 +++++ .../org.eclipse.core.resources.prefs | 6 + .../.settings/org.eclipse.jdt.core.prefs | 10 ++ .../.settings/org.eclipse.m2e.core.prefs | 4 + ....eclipse.wst.common.project.facet.core.xml | 4 + .../org.springframework.ide.eclipse.prefs | 2 + SpringBootSwagger2/pom.xml | 57 +++++++++ .../src/main/java/com/zz/App.java | 21 ++++ .../java/com/zz/config/SwaggerConfig.java | 34 +++++ .../com/zz/controller/UserController.java | 119 ++++++++++++++++++ .../src/main/java/com/zz/entity/User.java | 43 +++++++ .../src/main/resources/application.properties | 5 + .../zz/SpringBootSwagger2/pom.properties | 7 ++ .../maven/zz/SpringBootSwagger2/pom.xml | 57 +++++++++ .../target/classes/application.properties | 5 + .../target/classes/com/zz/App.class | Bin 0 -> 744 bytes .../classes/com/zz/config/SwaggerConfig.class | Bin 0 -> 2343 bytes .../com/zz/controller/UserController.class | Bin 0 -> 4044 bytes .../target/classes/com/zz/entity/User.class | Bin 0 -> 1319 bytes pom.xml | 1 + 21 files changed, 447 insertions(+) create mode 100644 SpringBootSwagger2/.classpath create mode 100644 SpringBootSwagger2/.project create mode 100644 SpringBootSwagger2/.settings/org.eclipse.core.resources.prefs create mode 100644 SpringBootSwagger2/.settings/org.eclipse.jdt.core.prefs create mode 100644 SpringBootSwagger2/.settings/org.eclipse.m2e.core.prefs create mode 100644 SpringBootSwagger2/.settings/org.eclipse.wst.common.project.facet.core.xml create mode 100644 SpringBootSwagger2/.settings/org.springframework.ide.eclipse.prefs create mode 100644 SpringBootSwagger2/pom.xml create mode 100644 SpringBootSwagger2/src/main/java/com/zz/App.java create mode 100644 SpringBootSwagger2/src/main/java/com/zz/config/SwaggerConfig.java create mode 100644 SpringBootSwagger2/src/main/java/com/zz/controller/UserController.java create mode 100644 SpringBootSwagger2/src/main/java/com/zz/entity/User.java create mode 100644 SpringBootSwagger2/src/main/resources/application.properties create mode 100644 SpringBootSwagger2/target/classes/META-INF/maven/zz/SpringBootSwagger2/pom.properties create mode 100644 SpringBootSwagger2/target/classes/META-INF/maven/zz/SpringBootSwagger2/pom.xml create mode 100644 SpringBootSwagger2/target/classes/application.properties create mode 100644 SpringBootSwagger2/target/classes/com/zz/App.class create mode 100644 SpringBootSwagger2/target/classes/com/zz/config/SwaggerConfig.class create mode 100644 SpringBootSwagger2/target/classes/com/zz/controller/UserController.class create mode 100644 SpringBootSwagger2/target/classes/com/zz/entity/User.class diff --git a/SpringBootSwagger2/.classpath b/SpringBootSwagger2/.classpath new file mode 100644 index 0000000..d2bc4e0 --- /dev/null +++ b/SpringBootSwagger2/.classpath @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SpringBootSwagger2/.project b/SpringBootSwagger2/.project new file mode 100644 index 0000000..0c95dcb --- /dev/null +++ b/SpringBootSwagger2/.project @@ -0,0 +1,34 @@ + + + SpringBootSwagger2 + + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + org.springframework.ide.eclipse.boot.validation.springbootbuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + + diff --git a/SpringBootSwagger2/.settings/org.eclipse.core.resources.prefs b/SpringBootSwagger2/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..04cfa2c --- /dev/null +++ b/SpringBootSwagger2/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding//src/test/java=UTF-8 +encoding//src/test/resources=UTF-8 +encoding/=UTF-8 diff --git a/SpringBootSwagger2/.settings/org.eclipse.jdt.core.prefs b/SpringBootSwagger2/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..107b45b --- /dev/null +++ b/SpringBootSwagger2/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,10 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/SpringBootSwagger2/.settings/org.eclipse.m2e.core.prefs b/SpringBootSwagger2/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..14b697b --- /dev/null +++ b/SpringBootSwagger2/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/SpringBootSwagger2/.settings/org.eclipse.wst.common.project.facet.core.xml b/SpringBootSwagger2/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..017b6f4 --- /dev/null +++ b/SpringBootSwagger2/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,4 @@ + + + + diff --git a/SpringBootSwagger2/.settings/org.springframework.ide.eclipse.prefs b/SpringBootSwagger2/.settings/org.springframework.ide.eclipse.prefs new file mode 100644 index 0000000..e587c65 --- /dev/null +++ b/SpringBootSwagger2/.settings/org.springframework.ide.eclipse.prefs @@ -0,0 +1,2 @@ +boot.validation.initialized=true +eclipse.preferences.version=1 diff --git a/SpringBootSwagger2/pom.xml b/SpringBootSwagger2/pom.xml new file mode 100644 index 0000000..d5b97ff --- /dev/null +++ b/SpringBootSwagger2/pom.xml @@ -0,0 +1,57 @@ + + 4.0.0 + + zz + SpringBoot2 + 0.0.1-SNAPSHOT + + SpringBootSwagger2 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + true + + + + + mysql + mysql-connector-java + 8.0.15 + + + + io.springfox + springfox-swagger2 + 2.6.1 + + + io.springfox + springfox-swagger-ui + 2.6.1 + + + + + + alimaven + aliyun maven + http://maven.aliyun.com/nexus/content/groups/public/ + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/SpringBootSwagger2/src/main/java/com/zz/App.java b/SpringBootSwagger2/src/main/java/com/zz/App.java new file mode 100644 index 0000000..78a2e87 --- /dev/null +++ b/SpringBootSwagger2/src/main/java/com/zz/App.java @@ -0,0 +1,21 @@ +package com.zz; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; +/** + * 右键--》run as application 运行正启动类的main方法,就可以启动这个springboot项目。 +SpringBoot 自带了 tomcat, 运行这个main方法 的时候,会同时启动tomcat + * @author jiyu + * + */ +@SpringBootApplication +@EnableScheduling +public class App { + + public static void main(String[] args) { + // TODO Auto-generated method stub + SpringApplication.run(App.class, args); + } + +} diff --git a/SpringBootSwagger2/src/main/java/com/zz/config/SwaggerConfig.java b/SpringBootSwagger2/src/main/java/com/zz/config/SwaggerConfig.java new file mode 100644 index 0000000..c31109d --- /dev/null +++ b/SpringBootSwagger2/src/main/java/com/zz/config/SwaggerConfig.java @@ -0,0 +1,34 @@ +package com.zz.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; + +@Configuration +@EnableSwagger2 +public class SwaggerConfig { + @Bean + public Docket buildDocket() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(buildApiInf()) + .select() + .apis(RequestHandlerSelectors.basePackage("com.zz.controller")) + .paths(PathSelectors.any()) + .build(); + } + private ApiInfo buildApiInf() { + return new ApiInfoBuilder() + .title("系统RESTful API文档") + .contact(new Contact("Bsea", "https://me.csdn.net/h356363", "yinyouhai@aliyun.com")) + .version("1.0") + .build(); + } +} \ No newline at end of file diff --git a/SpringBootSwagger2/src/main/java/com/zz/controller/UserController.java b/SpringBootSwagger2/src/main/java/com/zz/controller/UserController.java new file mode 100644 index 0000000..7372847 --- /dev/null +++ b/SpringBootSwagger2/src/main/java/com/zz/controller/UserController.java @@ -0,0 +1,119 @@ +package com.zz.controller; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.zz.entity.User; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import springfox.documentation.annotations.ApiIgnore; + +@Api(value = "用户Controller") +@Controller +@RequestMapping("user") +public class UserController { + + @ApiIgnore + @GetMapping("hello") + public @ResponseBody String hello() { + return "hello"; + } + + @ApiOperation(value = "获取用户信息", notes = "根据用户id获取用户信息") + @ApiImplicitParam(name = "id", value = "用户id", required = true, dataType = "Long", paramType = "path") + @GetMapping("/{id}") + public @ResponseBody User getUserById(@PathVariable(value = "id") String id) { + User user = new User(); + user.setId(id); + user.setName("mrbird"); + user.setAge(25); + return user; + } + + @ApiOperation(value = "获取用户列表", notes = "获取用户列表") + @GetMapping("/list") + public @ResponseBody List getUserList() { + List list = new ArrayList<>(); + User user1 = new User(); + user1.setId("1l"); + user1.setName("mrbird"); + user1.setAge(25); + list.add(user1); + User user2 = new User(); + user2.setId("2l"); + user2.setName("scott"); + user2.setAge(29); + list.add(user2); + return list; + } + + @ApiOperation(value = "新增用户", notes = "根据用户实体创建用户") + @ApiImplicitParam(name = "user", value = "用户实体", required = true, dataType = "User") + @PostMapping("/add") + public @ResponseBody Map addUser(@RequestBody User user) { + Map map = new HashMap<>(); + map.put("result", "success"); + return map; + } + + @ApiOperation(value = "删除用户", notes = "根据用户id删除用户") + @ApiImplicitParam(name = "id", value = "用户id", required = true, dataType = "Long", paramType = "path") + @DeleteMapping("/{id}") + public @ResponseBody Map deleteUser(@PathVariable(value = "id") Long id) { + Map map = new HashMap<>(); + map.put("result", "success"); + return map; + } + + @ApiOperation(value = "更新用户", notes = "根据用户id更新用户") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "用户id", required = true, dataType = "Long", paramType = "path"), + @ApiImplicitParam(name = "user", value = "用户实体", required = true, dataType = "User") }) + @PutMapping("/{id}") + public @ResponseBody Map updateUser(@PathVariable(value = "id") Long id, @RequestBody User user) { + Map map = new HashMap<>(); + map.put("result", "success"); + return map; + } + +} + +/** + * + * + * Swagger常用注解 +@Api:修饰整个类,描述Controller的作用; +@ApiOperation:描述一个类的一个方法,或者说一个接口; +@ApiParam:单个参数描述; +@ApiModel:用对象来接收参数; +@ApiProperty:用对象接收参数时,描述对象的一个字段; +@ApiResponse:HTTP响应其中1个描述; +@ApiResponses:HTTP响应整体描述; +@ApiIgnore:使用该注解忽略这个API; +@ApiError :发生错误返回的信息; +@ApiImplicitParam:一个请求参数; +@ApiImplicitParams:多个请求参数。 +编写RESTful API接口 +Spring Boot中包含了一些注解,对应于HTTP协议中的方法: +@GetMapping对应HTTP中的GET方法; +@PostMapping对应HTTP中的POST方法; +@PutMapping对应HTTP中的PUT方法; +@DeleteMapping对应HTTP中的DELETE方法; +@PatchMapping对应HTTP中的PATCH方法。 +8** +**/ diff --git a/SpringBootSwagger2/src/main/java/com/zz/entity/User.java b/SpringBootSwagger2/src/main/java/com/zz/entity/User.java new file mode 100644 index 0000000..c7729bf --- /dev/null +++ b/SpringBootSwagger2/src/main/java/com/zz/entity/User.java @@ -0,0 +1,43 @@ +package com.zz.entity; + +public class User { + + private String id; + private String name; + private String pwd; + private String sex; + private int age; + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getPwd() { + return pwd; + } + public void setPwd(String pwd) { + this.pwd = pwd; + } + public String getSex() { + return sex; + } + public void setSex(String sex) { + this.sex = sex; + } + public int getAge() { + return age; + } + public void setAge(int age) { + this.age = age; + } + + + +} diff --git a/SpringBootSwagger2/src/main/resources/application.properties b/SpringBootSwagger2/src/main/resources/application.properties new file mode 100644 index 0000000..28b152a --- /dev/null +++ b/SpringBootSwagger2/src/main/resources/application.properties @@ -0,0 +1,5 @@ +//设置项目的端口号 +server.port=9080 +//设置工程名字 +// 所有路径都需要加a. http:localhost:9080/a/all +server.servlet.context-path=/a \ No newline at end of file diff --git a/SpringBootSwagger2/target/classes/META-INF/maven/zz/SpringBootSwagger2/pom.properties b/SpringBootSwagger2/target/classes/META-INF/maven/zz/SpringBootSwagger2/pom.properties new file mode 100644 index 0000000..0a7837b --- /dev/null +++ b/SpringBootSwagger2/target/classes/META-INF/maven/zz/SpringBootSwagger2/pom.properties @@ -0,0 +1,7 @@ +#Generated by Maven Integration for Eclipse +#Fri Aug 23 00:45:38 CST 2019 +version=0.0.1-SNAPSHOT +groupId=zz +m2e.projectName=SpringBootSwagger2 +m2e.projectLocation=C\:\\Users\\76582\\Documents\\workspace-sts-3.9.8.RELEASE\\SpringBoot2\\SpringBootSwagger2 +artifactId=SpringBootSwagger2 diff --git a/SpringBootSwagger2/target/classes/META-INF/maven/zz/SpringBootSwagger2/pom.xml b/SpringBootSwagger2/target/classes/META-INF/maven/zz/SpringBootSwagger2/pom.xml new file mode 100644 index 0000000..d5b97ff --- /dev/null +++ b/SpringBootSwagger2/target/classes/META-INF/maven/zz/SpringBootSwagger2/pom.xml @@ -0,0 +1,57 @@ + + 4.0.0 + + zz + SpringBoot2 + 0.0.1-SNAPSHOT + + SpringBootSwagger2 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + true + + + + + mysql + mysql-connector-java + 8.0.15 + + + + io.springfox + springfox-swagger2 + 2.6.1 + + + io.springfox + springfox-swagger-ui + 2.6.1 + + + + + + alimaven + aliyun maven + http://maven.aliyun.com/nexus/content/groups/public/ + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/SpringBootSwagger2/target/classes/application.properties b/SpringBootSwagger2/target/classes/application.properties new file mode 100644 index 0000000..28b152a --- /dev/null +++ b/SpringBootSwagger2/target/classes/application.properties @@ -0,0 +1,5 @@ +//设置项目的端口号 +server.port=9080 +//设置工程名字 +// 所有路径都需要加a. http:localhost:9080/a/all +server.servlet.context-path=/a \ No newline at end of file diff --git a/SpringBootSwagger2/target/classes/com/zz/App.class b/SpringBootSwagger2/target/classes/com/zz/App.class new file mode 100644 index 0000000000000000000000000000000000000000..f3b606d15472024e67a69637f734224e60bcc962 GIT binary patch literal 744 zcmZuv%We}f6g^IpCLIDT2^7jpVwYxtH;7HDN)W+nc!;2|VC78Q#AU{gJRU&(D^?&D zd;lMXI3B7di!A0|`##P+_l*Di{q-BbQ#@*;A&_LQkQW#7`D)chQ{doSeNi%3b|K%+ z&UF?9c2A5o;Z$H}a6A=gj@?`**uh>GE$j;Hr^f0xRWZ~4gPP@9pqIK#J zVQET%Zn~a0B3hx06*wGxO4pMo!5h069ZwV7M8A!mz|i@HELSmp=2fA;I{#VDoC|VN z2gyG-nF_|)E^gsA+4_pWv%v=LI9Fvk+BPZO2A??_^tT|#&Yqb?<>N9Na~O{4xPi!4!IGN)u;U>q5N}drr4f ztQAmIaO7HZ)R%g^pfnp?N%CYXK$$J|yvix7R9EBVOB;8cT;)c13@XZZ12lNzf2VEp zCg}xzYxo15?{zw%jcMQpuF-b?7tmklZI97?g2d)$H5kz8iQ!Kid|dY@%m6)B^*1m& cIK&;s@A7N$(a<$;RNH&FPaoSJ&_4wJ0UJ@iUjP6A literal 0 HcmV?d00001 diff --git a/SpringBootSwagger2/target/classes/com/zz/config/SwaggerConfig.class b/SpringBootSwagger2/target/classes/com/zz/config/SwaggerConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..ef3a903607039e496b025478bcb34966f811290e GIT binary patch literal 2343 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 SpringBootFile SpringBootHomework + SpringBootSwagger2