#Swagger
#SpringBoot如何使用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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- 提供一个Docket的Bean 即提供一个Swagger的配置类,首先使用@EnableSwagger2启用Swagger2 其次,配置一个Docket Bean,这个Bean配置映射路径和要扫描接口的位置,在apiInfo中是配置Swagger2网站信息 最后启动项目,访问http://localhost:8080/swagger-ui.html页面。
使用时注意吧Bean加入Spring 类上@Configuration注解 方法上@Bean
类详情
package com.wenwen.blog.learn.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
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
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi(){
return new Docket(DocumentationType.SWAGGER_2)
.pathMapping("/")
.select()
.apis(RequestHandlerSelectors.basePackage("ink.poesy.life.controller"))
.build().apiInfo(apiInfo());
}
/**
* 构建 api文档的详细信息函数,注意这里的注解引用的是哪个
* @return
*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
//页面标题
.title("Owen User Swagger")
//版本号
.version("1.0")
//描述
.description("API 描述")
.build();
}
}
- 启动后就可以使用了
- 让我来测试一下 编写类如下
package ink.poesy.life.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "Owner use Swagger Test 类的描述")
@RestController
@RequestMapping("/test")
public class Test {
@ApiOperation(value = "测试Swagger的接口的描述,备注",notes = "返回字符串test")
@GetMapping("/test")
public String test(){
return "test";
}
}
用于方法,字段; 表示对model属性的说明或者数据操作更改
value–字段说明 name–重写属性名字 dataType–重写属性类型 required–是否必填 example–举例说明 hidden–隐藏
使用效果
首先创建一个接收请求的controller,POST传入一个User对象
package ink.poesy.life.controller;
import ink.poesy.life.pojo.User;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Api(value = "用于用户相关的请求")
@RequestMapping("/userInfo")
public class UserController {
@ApiOperation(value = "展示用户信息",notes = "返回用户的信息")
@PostMapping("/showUserInfo")
public String showUserInfo(@RequestBody User userInfo){
return userInfo.toString();
}
}
创建user对象添加 @ApiModelProperty(value = "用户名",required = true)描述
package ink.poesy.life.pojo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class User {
/**
* 用户名
*/
@ApiModelProperty(value = "用户名",required = true)
private String name;
/**
* 密码
*/
@ApiModelProperty(value = "用户密码",required = true)
private String password;
}
前后端传入参数时,字符对应不上使用@JsonProperty("bUserName") 来把该属性的名称序列化为另外一个名称
- JsonProperty是位于jackson包里面, 搭配ObjectMapper().writeValueAsString(实体类)方法使用,将实体类转换成字符串。
- JSONField是位于fastjson包里面, 搭配JSON.toJSONString(实体类)方法使用,将实体类转换成json字符串。搭配JSON.parseObject(字符串,实体类.class)方法使用,将字符串转换成实体类。
简单来说,就是用isDebugEnabled方法判断下是能提升性能的。 (From: http://blog.sina.com.cn/s/blog_616b57310100f36s.html )
if (logger.isInfoEnabled()) {
logger.info("User " + userId + " is using app " + appId);
}
为什么要加上logger.isInfoEnabled()?原因有两点。
- 直接使用logger.info("User " + userId + " is using app " + appId)来输出log, 也能够达到log级别为INFO或在INFO以下时才输出: ("User " + userId + " is using app " + appId), 因为logger.info方法内部有判断输出级别的代码。 但是在进入logger.info函数之前,("User " + userId + " is using app " + appId) 这个表达式已经通过运算拼接成了一个字符串; 而如果事先使用 if (logger.isInfoEnabled())进行判断, 那么当log级别在INFO以上时,就能省去上述的字符串操作, 在高并发和复杂log信息拼接的情况下,使用这种标准的方法输出log能够省去不小的系统开销。 另外,如果构造log信息的过程需要大量字符串操作,建议使用StringBuilder来完成字符串拼接。
- ERROR及其以上级别的log信息是一定会被输出的, 所以只有logger.isDebugEnabled和logger.isInfoEnabled方法, 而没有logger.isErrorEnabled方法。
- 首先开启日志
<!-- 开启日志-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.1.7.RELEASE</version>
<scope>compile</scope>
</dependency>
- 添加xml在resource里
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration>
<!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
<!-- 定义日志存储的路径,不要配置相对路径 -->
<!-- <property name="FILE_PATH" value="E:/logs/demo.%d{yyyy-MM-dd}.%i.log" />-->
<!-- 控制台输出日志 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 按照上面配置的LOG_PATTERN来打印日志 -->
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!--每天生成一个日志文件,保存15天的日志文件。rollingFile是用来切分文件的 -->
<!-- <appender name="FILE"-->
<!-- class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!-- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
<!-- <fileNamePattern>${FILE_PATH}</fileNamePattern>-->
<!-- <!– keep 15 days' worth of history –>-->
<!-- <maxHistory>15</maxHistory>-->
<!-- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">-->
<!-- <!– 日志文件的最大大小 –>-->
<!-- <maxFileSize>10MB</maxFileSize>-->
<!-- </timeBasedFileNamingAndTriggeringPolicy>-->
<!-- </rollingPolicy>-->
<!-- <encoder>-->
<!-- <pattern>${LOG_PATTERN}</pattern>-->
<!-- </encoder>-->
<!-- </appender>-->
<!-- project default level -->
<logger name="src" level="INFO" />
<!-- 日志输出级别 常用的日志级别按照从高到低依次为:ERROR、WARN、INFO、DEBUG。 -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<!-- <appender-ref ref="FILE" />-->
</root>
</configuration>
- 在application.yml里配置日志
## 日志配置
logging:
learn.config: src/main/resources/logback.xml
# 数据库日志级别
level:
com.github.springbootmiaosha.dao: trace
- 就可以启动使用了
查看mybatis-plus官方网站
CREATE TABLE `userInfo` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`name` varchar(30) DEFAULT NULL COMMENT '姓名',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
DELETE FROM userInfo;
INSERT INTO userInfo (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@poesy.com'),
(2, 'Jack', 20, 'test2@poesy.com'),
(3, 'Tom', 28, 'test3@poesy.com'),
(4, 'Sandy', 21, 'test4@poesy.com'),
(5, 'Billie', 24, 'test5@poesy.com');
先添加mybatis-plus依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
添加数据库连接池 添加数据库连接驱动
<!-- mysql数据库的驱动包 start -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.18</version>
</dependency>
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/poesy_life?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: root
@Param是地处Dao层,是为了传递多个参数,解决的是可读性和直观性; 而@RequestParam是位列Controller层,作用是为获取前端参数,解决的是前后端参数不一致的问题。所以它们没有关系!