- 1.引入swagger2依赖
- 2.创建Swagger2Config配置类
- 3.加载Swagger2Config到service_hosp模块
- 4.为表示层添加swagger提供的注解进行注释
- 5.测试
- ①.访问swagger
- ②.测试get访问查询所有医院设置信息
- ③.测试delete访问逻辑删除某个id的医院信息
- 6.对返回数据进行统一的规范
- ①.添加统一返回结果状态信息枚举类
- ②.添加全局统一返回结果类
- ③.引入Result
- ④.修改controller
- ⑤测试结果
swagger2:可以自动生成文档注释和测试接口的ui
由于swagger2不止是service_hosp模块需要使用,其他模块也需要使用,所以将其引入到common的pom.xml文件中
2.创建Swagger2Config配置类io.springfox springfox-swagger2 io.springfox springfox-swagger-ui
在service_util的java目录下创建com.zhengyibao.yygh.common.config包
package com.zhengyibao.yygh.common.config;
import com.google.common.base.Predicates;
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.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;
import java.util.function.Predicate;
@Configuration
@EnableSwagger2 //开启Swagger2操作的注解
public class Swagger2Config {
@Bean //创建对象
public Docket webApiConfig() {
return new Docket(documentationType.SWAGGER_2)
.groupName("webApi")
.apiInfo(webApiInfo())
.select()
.paths(Predicates.and(PathSelectors.regex("/api/.*"))) //只显示api路径下的页面
.build();
}
@Bean
public Docket adminApiConfig() {
return new Docket(documentationType.SWAGGER_2)
.groupName("adminApi") //分组的名字
.apiInfo(adminApiInfo()) //相关api信息
.select()
.paths(Predicates.and(PathSelectors.regex("/admin/.*"))) //只显示admin路径下的页面(若包含admin就显示,不包含就不显示)
.build();
}
private ApiInfo webApiInfo() {
return new ApiInfoBuilder()
.title("网站-API文档")
.description("本文档描述了网站微服务接口定义")
.version("1.0")
.contact(new Contact("zhengyibao", "http://zhengyibao.com", "15978521338@163.com"))
.build();
}
private ApiInfo adminApiInfo() {
return new ApiInfoBuilder()
.title("后台管理系统-API文档")
.description("本文档描述了后台管理系统微服务接口定义")
.version("1.0")
.contact(new Contact("zhengyibao", "http://zhengyibao.com", "15978521338@163.com"))
.build();
}
}
3.加载Swagger2Config到service_hosp模块
1.加载common/service_util中的到service模块的pom.xml中
com.zhengyibao model 0.0.1-SNAPSHOT
2.在启动类上添加包扫描,因为两者包名不同,且都是以com.zhengyibao开头
package com.zhengyibao.yygh.hosp;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan(basePackages = "com.zhengyibao") //设置扫描规则,使用配置类Swagger2Config进行测试
//1.加载common/service_util中的到service模块的pom.xml中
//2.而两者包名不同,但包名都是以com.zhengyibao开头,还需要额外在启动类上添加包扫描
public class ServiceHospApplication {
public static void main(String[] args){
SpringApplication.run(ServiceHospApplication.class, args);
}
}
4.为表示层添加swagger提供的注解进行注释
@Api(tags = "医院设置管理") //swagger的注解,中文提示信息 @ApiOperation(value = "获取所有医院设置信息") @ApiOperation(value = "根据id逻辑删除医院设置信息")5.测试 ①.访问swagger
swagger有它自己的访问方式:浏览器访问http://localhost:8201/swagger-ui.html
http://[IP地址]:[服务端口号]/swagger-ui.html
中间出来一个错误导致访问swagger时报Whitelabel Error Page错误
控制台报Identify and stop the process that’s listening on port 8201 or configure this application to listen错误
错误原因:端口占有
解决1:可以在application.properties文件中修改服务端口号server.port=8201
解决2:使用netstat -ano查看自己服务端口号8021对应的pid,再使用taskkill /pid [pid] -f 杀掉端口
如果不加swagger提供的注解的页面
②.测试get访问查询所有医院设置信息 ③.测试delete访问逻辑删除某个id的医院信息加了注解后
由于findAll和deleteById返回值不一样,不利于前端数据的显示,为了方便,所以对返回数据进行统一的规范
①.添加统一返回结果状态信息枚举类由于都需要返回统一结果,所以将其放到common_util子模块中
在common_util下的java目录下创建com.zhengyibao.yygh.common.result包
package com.zhengyibao.yygh.common.result;
import lombok.Getter;
@Getter //lombok提供
public enum ResultCodeEnum {
//(状态码,状态信息)
SUCCESS(200,"成功"),
FAIL(201,"失败"),
PARAM_ERROR(202,"参数不正确"),
SERVICE_ERROR(203,"服务异常"),
DATA_ERROR(204,"数据异常"),
DATA_UPDATE_ERROR(205,"数据版本异常"),
LOGIN_AUTH(208,"未登录"),
PERMISSION(209,"没有权限"),
CODE_ERROR(210,"验证码错误"),
//LOGIN_MOBLE_ERROR(211,"账号不正确")
LOGIN_DISABLED_ERROR(212,"该用户已被禁用"),
REGISTER_MOBLE_ERROR(213,"手机号已被使用"),
LOGIN_AURH(214,"需要登录"),
LOGIN_ACL(215,"没有权限"),
URL_ENCODE_ERROR(216,"URL编码失败"),
ILLEGAL_CALLBACK_REQUEST_ERROR(217,"非法回调请求"),
PETCH_ACCESSTOKEN_ERROR(218,"获取用户accessToken失败"),
FETCH_USERINFO_ERROR(219,"获取用户信息失败"),
PAY_RUN(220,"支付中"),
CANCEL_ORDER_FAIL(225,"取消订单失败"),
CANCEL_ORDER_NO(225,"不能取消预约"),
HOSCODE_EXIST(230,"医院编号已经存在"),
NUMBER_NO(240,"可预约号不足"),
TIME_NO(250,"当前时间不可以预约"),
SIGN_ERROR(300,"签名错误"),
HOSPITAL_OPEN(310,"医院未开通,暂时不能访问"),
HOSPITAL_LOCK(320,"医院被锁定,暂时不能访问"),
; //需要加个分号
private Integer code;
private String message;
private ResultCodeEnum(Integer code,String message){
this.code=code;
this.message=message;
}
}
②.添加全局统一返回结果类
package com.zhengyibao.yygh.common.result; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value="全局统一返回结果") public class Result③.引入Result{ @ApiModelProperty(value = "返回码") private Integer code; @ApiModelProperty(value = "返回消息") private String message; @ApiModelProperty(value = "返回数据") private T data; public Result(){} protected static Result build(T data){ Result result=new Result (); if(data!=null) result.setData(data); return result; } public static Result build(T body,ResultCodeEnum resultCodeEnum){ Result result=build(body); result.setCode(resultCodeEnum.getCode()); result.setMessage(resultCodeEnum.getMessage()); return result; } public static Result build(Integer code,String message){ Result result=build(null); result.setCode(code); result.setMessage(message); return result; } public static Result ok(){return Result.ok(null);} //操作成功 public static Result ok(T data){ Result result=build(data); return build(data,ResultCodeEnum.SUCCESS); } public static Result fail(){return Result.fail(null);} //操作失败 public static Result fail(T data){ Result result=build(data); return build(data,ResultCodeEnum.FAIL); } // public Result code(Integer code){ // // } }
由于需要在service_hosp中使用Result全局统一返回结果类,所以在service的pom.xml文件中引入common_util模块
④.修改controllercom.zhengyibao service_util 1.0
package com.zhengyibao.yygh.hosp.controller;
import com.zhengyibao.yygh.common.result.Result;
import com.zhengyibao.yygh.hosp.service.HospitalSetService;
import com.zhengyibao.yygh.model.hosp.HospitalSet;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Api(tags = "医院设置管理") //swagger的注解,中文提示信息
@RestController //里面有两个主要注解,1.@Controller:让HospitalSetController交给spring管理 2.@ResponseBody:返回数据(以json格式返回)
@RequestMapping("/admin/hosp/hospitalSet") //访问的路径 http://localhost:8201/admin/hosp/hospitalSet/findAll
public class HospitalSetController {
//注入service
@Autowired
private HospitalSetService hospitalSetService;
//1.查询医院设置表的所有信息
@ApiOperation(value = "获取所有医院设置信息") //swagger的注解,方法的中文提示信息
@GetMapping("findAll") //get方式提交(查询所有)
//返回统一结果的查询
public Result findAllHospitalSet(){
List list=hospitalSetService.list();
return Result.ok(list);
}
//2.根据id逻辑删除医院设置信息
@ApiOperation(value = "根据id逻辑删除医院设置信息")
@DeleteMapping("{id}") //delete方式提交(逻辑删除)
//返回统一结果的逻辑删除
public Result removeHospitalSet(@PathVariable Long id){
boolean flag=hospitalSetService.removeById(id);
if(flag){
return Result.ok(); //成功
}else{
return Result.fail(); //失败
}
}
}
⑤测试结果



