博客
关于我
MP实战系列(八)之SpringBoot+Swagger2
阅读量:467 次
发布时间:2019-03-06

本文共 16695 字,大约阅读时间需要 55 分钟。

SpringBoot一个原则,爱好编程的朋友们都知道,那就是"习惯优于配置"。

今天一上来主要说的还是代码,个人比较喜欢来的实战系列的,不过有的时候还是比较偏重于理论,理论是造轮子的基础之一,尽管前人先辈们或者其他编程界的大牛们已经为我们造了不少轮子,大牛们造的轮子在广义上是比较通用的,例如jeecg的插件式开发等。

不过对于项目需求而言,有些时候不一定开源的就一定可以复用,有些时候我们必须要在此创新。

记得我一个朋友,他们公司给他的一个业务是测试框架,该测试框架必须匹配公司各个业务场景,他在开源上找了不少项目,但是发现还是不行,有些只能解解燃眉之急,但是风险不可控。所以我这位朋友他决定为了更好的匹配公司的业务,他决定自己造轮子,不过当然还是站在前人的肩膀上。他用技术还是Java的反射和Google的一个技术,记得我跟我提过,不过此时我不记得了。

最终他还是成功造轮子,在这里我想表达的不是,造轮子,对于现有的轮子,如果我要采用必先满足我个人这些要求:

(1)文档丰富;

(2)开源项目活跃;

(3)风险可控;

(4)学习成本低;

当然最主要的是前三项,当然如果是开发赶进度的话,第四项不得不考虑进来。

毕竟一项技术,一个团队再用,如果学习成本毕竟高的话,到时项目遇到各种各样的问题,光解决问题就会花不少时间。

前三项就不用特别说了,文档丰富,例如Spring文档就很丰富。活跃,项目活跃至少可以和开源项目的开发人员进行交流。风险可控,对于企业而言,风险不可控意味着非常大的隐患,特别是金融方面的。

闲话不多说了,下面贴代码:

一、导入依赖

4.0.0
cn.blog
blog001
0.0.1-SNAPSHOT
war
org.springframework.boot
spring-boot-starter-parent
1.5.9.RELEASE
aliyun
http://maven.aliyun.com/nexus/content/groups/public/
snapshots
https://oss.sonatype.org/content/repositories/snapshots/
UTF-8
1.8
1.8
2.1.9
2.1.8
2.4.13
1.2.39
1.1.0
org.apache.shiro
shiro-core
1.2.2
org.apache.shiro
shiro-spring
1.3.2
io.springfox
springfox-swagger2
2.2.2
io.springfox
springfox-swagger-ui
2.2.2
org.slf4j
slf4j-api
1.7.19
com.alibaba
druid
${druid.version}
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
provided
org.apache.tomcat.embed
tomcat-embed-jasper
provided
com.zaxxer
HikariCP-java7
${HikariCP.version}
com.alibaba
fastjson
${fastjson.version}
com.baomidou
mybatis-plus-boot-starter
${mybatis-plus-boot-starter.version}
tomcat-jdbc
org.apache.tomcat
org.springframework.boot
spring-boot-starter-test
test
com.jayway.restassured
rest-assured
2.9.0
test
org.apache.velocity
velocity
1.7
test
mysql
mysql-connector-java
5.1.21
org.springframework.boot
spring-boot-maven-plugin

  

二、编写Java代码

Application.java 启动类

package com.blog.springboot;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.Banner;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.transaction.annotation.EnableTransactionManagement;@EnableTransactionManagement@SpringBootApplicationpublic class Application {    protected final static Logger logger = LoggerFactory.getLogger(Application.class);    public static void main(String[] args) {        SpringApplication app = new SpringApplication(Application.class);        app.setBannerMode(Banner.Mode.OFF);        app.run(args);        logger.info("Application is success!");         }}

 

MyMetaObjectHandler.java

package com.blog.springboot;import com.baomidou.mybatisplus.mapper.MetaObjectHandler;import org.apache.ibatis.reflection.MetaObject;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** *  注入公共字段自动填充,任选注入方式即可 *///@Componentpublic class MyMetaObjectHandler extends MetaObjectHandler {    protected final static Logger logger = LoggerFactory.getLogger(Application.class);    @Override    public void insertFill(MetaObject metaObject) {        logger.info("新增");    }    @Override    public void updateFill(MetaObject metaObject) {        logger.info("更新");    }}

 

MybatisPlusConfig.java(扫描Mapper文件)

package com.blog.springboot.config;import java.util.ArrayList;import java.util.List;import com.baomidou.mybatisplus.incrementer.H2KeyGenerator;import com.baomidou.mybatisplus.incrementer.IKeyGenerator;import com.baomidou.mybatisplus.mapper.ISqlInjector;import com.baomidou.mybatisplus.mapper.LogicSqlInjector;import com.baomidou.mybatisplus.mapper.MetaObjectHandler;import org.mybatis.spring.annotation.MapperScan;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import com.baomidou.mybatisplus.plugins.PaginationInterceptor;import com.baomidou.mybatisplus.plugins.PerformanceInterceptor;import com.baomidou.mybatisplus.plugins.parser.ISqlParser;import com.baomidou.mybatisplus.plugins.parser.tenant.TenantHandler;import com.baomidou.mybatisplus.plugins.parser.tenant.TenantSqlParser;import com.blog.springboot.MyMetaObjectHandler;import net.sf.jsqlparser.expression.Expression;import net.sf.jsqlparser.expression.LongValue;@Configuration@MapperScan("com.blog.springboot.mapper*")public class MybatisPlusConfig {    /**     * mybatis-plus SQL执行效率插件【生产环境可以关闭】     */    @Bean    public PerformanceInterceptor performanceInterceptor() {        return new PerformanceInterceptor();    }    @Bean    public MetaObjectHandler metaObjectHandler(){        return new MyMetaObjectHandler();    }    /**     * 注入主键生成器     */    @Bean    public IKeyGenerator keyGenerator(){        return new H2KeyGenerator();    }    /**     * 注入sql注入器     */    @Bean    public ISqlInjector sqlInjector(){        return new LogicSqlInjector();    }}

 

Swagger2.java

package com.blog.springboot.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.spi.DocumentationType;import springfox.documentation.spring.web.plugins.Docket;import springfox.documentation.swagger2.annotations.EnableSwagger2;@Configuration@EnableSwagger2public class Swagger2 {         @Bean        public Docket createRestApi() {            return new Docket(DocumentationType.SWAGGER_2)                    .apiInfo(apiInfo())                    .select()                    .apis(RequestHandlerSelectors.basePackage("com.blog.springboot"))                    .paths(PathSelectors.any())                    .build();        }        private ApiInfo apiInfo() {            return new ApiInfoBuilder()                    .title("博客系统")                    .description("世界因编程而美好,编程改变世界")                    .termsOfServiceUrl("http://520.cn")                    .contact("yy")                    .version("1.0")                    .build();        }}

WebConfig.java

package com.blog.springboot.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.servlet.ViewResolver;import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;import org.springframework.web.servlet.view.InternalResourceViewResolver;/** * 

* WEB 初始化相关配置 *

*/@ControllerAdvice@Configurationpublic class WebConfig extends WebMvcConfigurerAdapter { @Bean public ViewResolver getViewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/view/"); resolver.setSuffix(".jsp"); return resolver; } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { //将所有/static/** 访问都映射到classpath:/static/ 目录下 registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); }}

 

UserEntity.java

package com.blog.springboot.entity;import java.io.Serializable;import com.baomidou.mybatisplus.activerecord.Model;import com.baomidou.mybatisplus.annotations.TableField;import com.baomidou.mybatisplus.annotations.TableId;import com.baomidou.mybatisplus.annotations.TableName;import com.baomidou.mybatisplus.enums.IdType;/** * 

* *

* * @author youcong123 * @since 2018-05-19 */@TableName("user")public class UserEntity extends Model
{ /** * 用户ID */ @TableId(value = "user_id", type = IdType.AUTO) private Integer user_id; /** * 用户名 */ private String username; /** * 性别 */ private Integer sex; /** * 电话 */ private String phone; /** * 密码 */ private String password; /** * 等级 */ private Integer level; /** * 用户创建时间 */ @TableField("create_time") private String createTime; /** * 邮箱 */ private String email; /** * 登录标识 */ private Integer logo; /** * 登录时间 */ @TableField("login_time") private String loginTime; public Integer getUserId() { return user_id; } public void setUserId(Integer user_id) { this.user_id = user_id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getSex() { return sex; } public void setSex(Integer sex) { this.sex = sex; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getLevel() { return level; } public void setLevel(Integer level) { this.level = level; } public String getCreateTime() { return createTime; } public void setCreateTime(String createTime) { this.createTime = createTime; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Integer getLogo() { return logo; } public void setLogo(Integer logo) { this.logo = logo; } public String getLoginTime() { return loginTime; } public void setLoginTime(String loginTime) { this.loginTime = loginTime; } @Override public String toString() { return "User{" + "userId=" + user_id + ", username=" + username + ", sex=" + sex + ", phone=" + phone + ", password=" + password + ", level=" + level + ", createTime=" + createTime + ", email=" + email + ", logo=" + logo + ", loginTime=" + loginTime + "}"; } @Override protected Serializable pkVal() { // TODO Auto-generated method stub return this.user_id; }}

 

UserDao.java

package com.blog.springboot.mapper;import com.blog.springboot.entity.UserEntity;import com.baomidou.mybatisplus.mapper.BaseMapper;/** * 

* Mapper 接口 *

* * @author youcong123 * @since 2018-05-19 */public interface UserDao extends BaseMapper
{}

 

UserService.java

package com.blog.springboot.service;import com.blog.springboot.entity.UserEntity;import com.baomidou.mybatisplus.service.IService;/** * 

* 服务类 *

* * @author youcong123 * @since 2018-05-19 */public interface UserService extends IService
{}

 

UserServiceImpl.java

package com.blog.springboot.service.impl;import com.blog.springboot.entity.UserEntity;import com.blog.springboot.mapper.UserDao;import com.blog.springboot.service.UserService;import com.baomidou.mybatisplus.service.impl.ServiceImpl;import org.springframework.stereotype.Service;/** * 

* 服务实现类 *

* * @author youcong123 * @since 2018-05-19 */@Servicepublic class UserServiceImpl extends ServiceImpl
implements UserService {}

 

UserController.java

package com.blog.springboot.controller;import java.util.List;import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import com.alibaba.fastjson.JSON;import com.blog.springboot.entity.UserEntity;import com.blog.springboot.service.UserService;import io.swagger.annotations.ApiOperation;/** * 

* 前端控制器 *

* * @author youcong123 * @since 2018-05-19 */@Controller@RequestMapping("/user")public class UserController { @GetMapping(value="/test") public String index() { return "index"; } @Autowired private UserService userService; @ApiOperation(value="获取用户列表", notes="") @GetMapping(value="/list",produces="application/json;charset=utf-8") @ResponseBody public String list(Map
map) { List
list = userService.selectList(null); map.put("list", list); return JSON.toJSONString(map); } }

 

UserDao.xml

user_id AS userId, username, sex, phone, password, level, create_time AS createTime, email, logo, login_time AS loginTime

 

三、编写配置文件

application.yml

#appserver:    port: 8080spring:  devtools:    restart:      enabled: false  datasource:    url: jdbc:mysql://localhost:3306/blog?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false    username: root    password: 1234    db-name: blog    filters: log4j,wall,mergeStat1#mybatismybatis-plus:  mapper-locations: classpath:/mapper/*Dao.xml  #实体扫描,多个package用逗号或者分号分隔  typeAliasesPackage: com.blog.springboot.entity  global-config:    #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";    id-type: 2    #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"    field-strategy: 2    #驼峰下划线转换    db-column-underline: true    #刷新mapper 调试神器    refresh-mapper: true    #数据库大写下划线转换    #capital-mode: true    #逻辑删除配置(下面3个配置)    logic-delete-value: 0    logic-not-delete-value: 1    #自定义sql注入器,不在推荐使用此方式进行配置,请使用自定义bean注入    sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector    #自定义填充策略接口实现,不在推荐使用此方式进行配置,请使用自定义bean注入    meta-object-handler: com.blog.springboot.MyMetaObjectHandler    #自定义SQL注入器    #sql-injector: com.baomidou.springboot.xxx    # SQL 解析缓存,开启后多租户 @SqlParser 注解生效    sql-parser-cache: true  configuration:    map-underscore-to-camel-case: true    cache-enabled: false#logginglogging:  level: warn

 

四、添加swagger-ui相关界面

swagger-ui界面可以去github下载,地址为:https://github.com/swagger-api/swagger-ui

我个人下载的是如上红色标记处,最新版

下载完毕后将其解压,并在dist目录的所有文件放置在static文件夹下的swagger-ui文件夹下

 

五、启动Application,访问

 

swagger界面

 

转载地址:http://htobz.baihongyu.com/

你可能感兴趣的文章
Moment.js常见用法总结
查看>>
MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
查看>>
mxGraph改变图形大小重置overlay位置
查看>>
MongoDB可视化客户端管理工具之NoSQLbooster4mongo
查看>>
Mongodb学习总结(1)——常用NoSql数据库比较
查看>>
MongoDB学习笔记(8)--索引及优化索引
查看>>
mongodb定时备份数据库
查看>>
mppt算法详解-ChatGPT4o作答
查看>>
mpvue的使用(一)必要的开发环境
查看>>
MQ 重复消费如何解决?
查看>>
mqtt broker服务端
查看>>
MQTT 保留消息
查看>>
MQTT 持久会话与 Clean Session 详解
查看>>
MQTT介绍及与其他协议的比较
查看>>
MQTT工作笔记0007---剩余长度
查看>>
MQTT工作笔记0008---服务质量
查看>>
MQTT工作笔记0009---订阅主题和订阅确认
查看>>
Mqtt搭建代理服务器进行通信-浅析
查看>>
MS COCO数据集介绍
查看>>
MS Edge浏览器“STATUS_INVALID_IMAGE_HASH“兼容性问题
查看>>