zoukankan      html  css  js  c++  java
  • Spring boot 整合 Swagger

    引入依赖:

    首先导入Swagger所需的依赖:

    <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>2.9.2</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>2.9.2</version>
            </dependency>
            <!-- 使用Swagger2最新版本2.9.2避免NumberFormatException错误要引入下列两个依赖 -->
            <dependency>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-annotations</artifactId>
                <version>1.5.21</version>
            </dependency>
            <dependency>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-models</artifactId>
                <version>1.5.21</version>
            </dependency>

    Swagger配置:

    在conf下新建一个Swagger.java配置类:

    @Configuration
    @EnableSwagger2
    public class SwaggerConfig {
        @Bean
        public Docket createRestApi(){
            return  new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(apiInfo())
                    .select()
                    .apis(RequestHandlerSelectors.basePackage("com.winstar.system.controller"))
                    .paths(PathSelectors.regex("/.*"))
                    .build();
        }
        private ApiInfo apiInfo(){
            return new ApiInfoBuilder()
                    .title("WinStar-Vehicle 电动车项目构建")
                    .description("文档地址:https://www.cnblogs.com/xiaofanblog/")
                    .termsOfServiceUrl("https://www.cnblogs.com/xiaofanblog/")
                    .contact(new Contact("xiaofan","https://www.cnblogs.com/xiaofanblog/","1320237548@qq.com"))
                    .version("v1.0")
                    .build();
        }
    }

    以上就是Swagger全局配置信息,其中最需要注意的有以下几点:

    Swagger生成API文档方式是通过扫描指定package下的请求映射类,根据映射接口生成API文档接口,所以关键是配置好扫描的接口类地址。

    .apis(RequestHandlerSelectors.basePackage("com.winstar.system.controller"))扫描请求映射类package地址。一般用SpringMVC时,我们常把请求应映射类放在/controller/package下。

    .paths(PathSelectors.regex("/.*"))扫描请求的路径,比如你想在Swagger中显示所有以/rest开头的接口地址(比如rest/save),就设置regex("/rest/.*"),这个.*就是匹配所有子级请求。这里我们配置的扫描所有请求。

    查看PathSelectors类源码:

    public class PathSelectors {
        private PathSelectors() {
            throw new UnsupportedOperationException();
        }
    
        public static Predicate<String> any() {
            return Predicates.alwaysTrue();
        }
    
        public static Predicate<String> none() {
            return Predicates.alwaysFalse();
        }
    
        public static Predicate<String> regex(final String pathRegex) {
            return new Predicate<String>() {
                public boolean apply(String input) {
                    return input.matches(pathRegex);
                }
            };
        }
    
        public static Predicate<String> ant(final String antPattern) {
            return new Predicate<String>() {
                public boolean apply(String input) {
                    AntPathMatcher matcher = new AntPathMatcher();
                    return matcher.match(antPattern, input);
                }
            };
        }
    }

    发现它能支持4中方式按照路径生成API文档:

    1.任何路径都生成;2.任何路径都不生成;3.正则匹配路径;4.ant模式匹配。

    上面我们就是配置的正则匹配路径,按照正则标准,Swagger扫描对应的API接口并生成文档。

    既然用到了Swagger,那就必然遵循RESTful接口规范:

    编写业务代码:

    entity: 

    在entity下新建一个实体类对象User.java

    @Entity
    @Data
    @Table(name = "user")
    public class User {
        /**
         * 主键id
         */
        @Id
        @GeneratedValue
        private Integer id;
    
        /**
         * 姓名
         */
        private String name;
    
        /**
         * 账号
         */
        private String account;
    
        /**
         * 密码
         */
        @JsonIgnore
        private String password;
    
        /**
         * 盐
         */
        @JsonIgnore
        private String salt;
    
        /**
         * 是否禁用 0:否;1:是
         */
        private String forbidden;
    }

    Result:

    通常,Controller返回的数据都应该被封装在一个结果类中,目的是保证所有请求返回结果都有固定的响应格式,比如:状态码状态信息返回结果。所以我们简单封装一个结果类:R.java

    /**
     * HTTP返回得对象模型
     * @param <T>
     */
    @Data
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public class R<T> {
        /**
         * 状态码
         */
        private Integer code;
    
        /**
         * 提示信息
         */
        private String msg;
    
        /**
         * 具体数据
         */
        private T data;
    }

    controller:

    在controller下新建控制类 UserController.java,编写常见的CRUD业务场景:

    @Slf4j
    @RestController
    @RequestMapping("/api/v1/sys")
    @Api(value = "UserController",tags = {"用户管理"})
    public class UserController {
        @Autowired
        private UserService userService;
    
        /**
         * 新增用户
         * @param userFrom
         * @param bindingResult
         * @return
         */
        @ApiOperation(value = "新增用户信息")
        @RequiresPermissions("sys:user:insert")
        @PostMapping("/saveUser")
        public R saveUser(@Valid @RequestBody UserFrom userFrom,
                          BindingResult bindingResult){
            if(bindingResult.hasErrors()){
                log.error("【新增用户】参数不正确:userFrom={}"+ userFrom);
                throw new SystemException(REnum.PARAM_ERROR.getCode(),bindingResult.getFieldError().getDefaultMessage());
            }
    
            return userService.saveUser(userFrom);
        }
    
    
        /**
         * 查询用户列表
         * @param page
         * @param size
         * @param name
         * @return
         */
        @ApiOperation(value = "查询用户列表")
        @RequiresPermissions("sys:user:list")
        @GetMapping("/selectUserList")
        public R selectUserList(@RequestParam(value = "page", defaultValue = "0") Integer page,
                                @RequestParam(value = "size", defaultValue = "10") Integer size,
                                @RequestParam(value = "name",defaultValue = "") String name){
    
            PageRequest pageRequest = new PageRequest(page,size);
            return userService.selectUserList(name,pageRequest);
        }
    
        /**
         * 查询用户详情
         * @param id
         * @return
         */
        @ApiOperation(value = "查询用户详情")
        @RequiresPermissions("sys:user:detail")
        @GetMapping("/selectUserDetail")
        public R selectUserDetail(@RequestParam(value = "id",required = false) Integer id){
    
            Assert.isNull(id,"id不能为空");
            return userService.selectUserDetail(id);
        }
    
        /**
         * 更新用户
         * @param userFrom
         * @param bindingResult
         * @return
         */
        @ApiOperation(value = "更新用户信息")
        @RequiresPermissions("sys:user:update")
        @PutMapping("/updateUser")
        public R updateUser(@Valid @RequestBody UserFrom userFrom,
                            BindingResult bindingResult){
    
            Assert.isNull(userFrom.getId(),"id不能为空");
    
            if(bindingResult.hasErrors()){
                log.error("【更新用户】参数不正确:userFrom = {}"+ userFrom);
                throw new SystemException(REnum.PARAM_ERROR.getCode(),bindingResult.getFieldError().getDefaultMessage());
            }
    
            return userService.updateUser(userFrom);
        }
    
        /**
         * 删除用户
         * @param id
         * @return
         */
        @ApiOperation(value = "删除用户信息")
        @RequiresPermissions("sys:user:delete")
        @DeleteMapping("/deleteUser/{id}")
        public R deleteUser(@PathVariable Integer id){
            return userService.delectUser(id);
        }
    }

    测试:

     启动项目,访问localhost:8080/swagger-ui.html:

     具体Swagger注解,请参考Swagger 注解篇:https://www.cnblogs.com/xiaofanblog/p/11430267.html

  • 相关阅读:
    CentOS 7 下Emacs无法录入中文的问题
    GPS文件中的C1--->P1转换
    centos7上搭建http服务器以及设置目录访问
    在Linux和Windows之间的远程控制的实现
    Emacs中的代码折叠控制
    Fortran程序调试中的“吐核”错误
    CentOS 7.6 系统上添加最新版 NetCDF 4.6.1
    迁移 Emacs 的自定义设置
    CentOS 7系统上制作Clonezilla(再生龙)启动U盘并克隆双系统
    [CentOS 7] TexLive2017中kpsewhich Bug的修复
  • 原文地址:https://www.cnblogs.com/xiaofanblog/p/11430386.html
Copyright © 2011-2022 走看看