基于springboot+bootstrap+mysql+redis搭建一套完整的权限架构【三】【整合swagger2和druid】

swagger2是一个在没有实现任何逻辑的情况下对API资源进行可视化的操作,它是根据swagger规范自动生成的,通过可视化文档使后端实现和客户端消耗变得容易。

直接在我们第二篇文章的master的主干版本上的config包底下创建SwaggerConfig的配置文件如下所示:


该文件的配置内容如下:

package com.csdn.demo.common.config;

import com.google.common.base.Predicate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.BasicErrorController;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.RequestHandler;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;


/*
* 类描述:集成swagger框架
* @auther linzf
* @create 2017/8/9 0009 
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Autowired
    private Environment env;


    @Bean
    public Docket createRestApi() {
        Predicate<RequestHandler> predicate = new Predicate<RequestHandler>() {
            @Override
            public boolean apply(RequestHandler input) {
                // 除非是在开发环境中否则不开启swagger2
                String active = env.getProperty("spring.profiles.active");
                if(!active.equalsIgnoreCase("dev")){
                    return false;
                }
                Class<?> declaringClass = input.declaringClass();
                if (declaringClass == BasicErrorController.class)// 排除
                    return false;
                if(declaringClass.isAnnotationPresent(RestController.class)) // 被注解的类
                    return true;
                if(input.isAnnotatedWith(ResponseBody.class)) // 被注解的方法
                    return true;
                return false;
            }
        };
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .useDefaultResponseMessages(false)
                .select()
                .apis(predicate)
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("swagger2 接口测试专用页面!")//大标题
                .version("1.0")//版本
                .build();
    }

}

到此我们完成了swagger2的集成,我们重新加载下代码(IDEA编译器中重新编译代码快捷键是CTRL+F9),然后运行我们的工程接着我们访问我们的工程(http://127.0.0.1:8080/swagger-ui.html)效果如下:


你会发现页面地址被重定向到了登陆页面,那是因为我们集成了security因此被拦截了,我们只需要登陆下我们的账号就可以正常跳转到我们的swagger2的页面:


该页面就是我们的swagger的页面,但是该页面上很明显是没有显示接口,那是因为我们到现在还没开始写我们的controller层的接口,因此此处就没有显示相应的接口,接下来我们在我们的sys包底下创建一个controller包同时创建一个UserController的类如下所示:

/*
* 类描述:用户维护controller
* @auther linzf
* @create 2017/9/7 0007
*/
@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping(value = "/save",method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public Map<String,Object> addUser(User user){
        Map<String,Object> result = new HashMap<String, Object>();
        result.put("success",true);
        result.put("msg","增加数据成功!");
        return result;
    }

}

我们接着再重新加载我们的程序并运行起来接着访问刚刚的页面我们就可以看到我们的刚刚添加的接口如下所示:


        到此我们就完成了swagger的整合,具体的扩展大家可以直接去swagger2的官网上去看详细的文档(https://swagger.io/swagger-ui/

       druid是Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和SQL解析器组成。该项目主要是为了扩展JDBC的一些限制,可以让程序员实现一些特殊的需求,比如向密钥服务请求凭证、统计SQL信息、SQL性能收集、SQL注入检查、SQL翻译等,程序员可以通过定制来实现自己需要的功能,接下来我们将整合druid到我们的项目中。

        在我们的config包底下创建druid包,同时创建我们的DruidConfiguration.java的配置文件内容如下:

/*
* 类描述:初始化druid数据库监控的配置
* @auther linzf
* @create 2017/9/27 0027 
*/
@Configuration
public class DruidConfiguration {

    private Logger logger = LoggerFactory.getLogger(DruidConfiguration.class);

    @Value("${spring.datasource.url}")
    private String dbUrl;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    @Value("${spring.datasource.driverClassName}")
    private String driverClassName;

    @Value("${spring.datasource.initialSize}")
    private int initialSize;

    @Value("${spring.datasource.minIdle}")
    private int minIdle;

    @Value("${spring.datasource.maxActive}")
    private int maxActive;

    @Value("${spring.datasource.maxWait}")
    private int maxWait;

    @Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
    private int timeBetweenEvictionRunsMillis;

    @Value("${spring.datasource.minEvictableIdleTimeMillis}")
    private int minEvictableIdleTimeMillis;

    @Value("${spring.datasource.validationQuery}")
    private String validationQuery;

    @Value("${spring.datasource.testWhileIdle}")
    private boolean testWhileIdle;

    @Value("${spring.datasource.testOnBorrow}")
    private boolean testOnBorrow;

    @Value("${spring.datasource.testOnReturn}")
    private boolean testOnReturn;

    @Value("${spring.datasource.poolPreparedStatements}")
    private boolean poolPreparedStatements;

    @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")
    private int maxPoolPreparedStatementPerConnectionSize;

    @Value("${spring.datasource.filters}")
    private String filters;

    @Value("{spring.datasource.connectionProperties}")
    private String connectionProperties;

    @Bean     //声明其为Bean实例
    @Primary  //在同样的DataSource中,首先使用被标注的DataSource
    public DataSource dataSource(){
        DruidDataSource datasource = new DruidDataSource();

        datasource.setUrl(this.dbUrl);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClassName);

        //configuration
        datasource.setInitialSize(initialSize);
        datasource.setMinIdle(minIdle);
        datasource.setMaxActive(maxActive);
        datasource.setMaxWait(maxWait);
        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        datasource.setValidationQuery(validationQuery);
        datasource.setTestWhileIdle(testWhileIdle);
        datasource.setTestOnBorrow(testOnBorrow);
        datasource.setTestOnReturn(testOnReturn);
        datasource.setPoolPreparedStatements(poolPreparedStatements);
        datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
        try {
            datasource.setFilters(filters);
        } catch (SQLException e) {
            logger.error("druid configuration initialization filter", e);
        }
        datasource.setConnectionProperties(connectionProperties);

        return datasource;
    }

    /**
     * 注册一个StatViewServlet
     * @return
     */
    @Bean
    public ServletRegistrationBean DruidStatViewServle(){
        //org.springframework.boot.context.embedded.ServletRegistrationBean提供类的进行注册.
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
        //添加初始化参数:initParams
        //白名单:
        servletRegistrationBean.addInitParameter("allow","127.0.0.1");
        //IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.
        servletRegistrationBean.addInitParameter("deny","192.168.1.73");
        //登录查看信息的账号密码.
        servletRegistrationBean.addInitParameter("loginUsername","admin");
        servletRegistrationBean.addInitParameter("loginPassword","hyll-2.0");
        //是否能够重置数据.
        servletRegistrationBean.addInitParameter("resetEnable","true");
        return servletRegistrationBean;
    }



    /**

     * 注册一个:filterRegistrationBean

     * @return

     */

    @Bean
    public FilterRegistrationBean druidStatFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
        //添加过滤规则.
        filterRegistrationBean.addUrlPatterns("/*");
        //添加不需要忽略的格式信息.
        filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid2/*");
        return filterRegistrationBean;
    }

}

接着打开我们之前的application-dev.properties配置文件,将该文件的内容修改成如下所示:

server.port = 8080
#数据库连接配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://10.6.71.236:3306/hyll_springboot?characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=haoyunll123
#连接池的配置信息
#初始化连接数
spring.datasource.initialSize=5  
#最小空闲连接数
spring.datasource.minIdle=5  
#最大连接数
spring.datasource.maxActive=20 
#
spring.datasource.maxWait=60000  
spring.datasource.timeBetweenEvictionRunsMillis=60000  
spring.datasource.minEvictableIdleTimeMillis=300000  
spring.datasource.validationQuery=SELECT 1 FROM DUAL  
spring.datasource.testWhileIdle=true  
spring.datasource.testOnBorrow=false  
spring.datasource.testOnReturn=false  
spring.datasource.poolPreparedStatements=true  
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20  
spring.datasource.filters=stat,wall,log4j  
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000  

接着我们重新加载我们的项目并启动我们的项目访问如下地址(http://127.0.0.1:8080/druid/login.html),发现还是被拦截,还是和之前一样我们直接登陆以后就会跳转到我们的druid的登陆界面,然后输入我们在DruidConfiguration中配置的账号和密码登陆我们的系统,那么我们就可以看到我们的druid监控模块如下所示:


到此我们将swagger2和druid整合到我们的项目中项目的github地址是:https://github.com/185594-5-27/csdndemo/tree/base-druid-swagger2


上一篇文章地址:基于springboot+bootstrap+mysql+redis搭建一套完整的权限架构【二】【整合springSecurity】


下一篇文章地址:基于springboot+bootstrap+mysql+redis搭建一套完整的权限架构【四】【编写基础开发工具】


QQ交流群:578746866



©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页