kotlin + spring boot 11/12/2018
kotlin + spring boot
初始化项目
- jdk 1.8
- kotlin 1.3
- spring boot 2.1.0
- gradle 4.4
添加allopen, noarg插件
build.gradle
1 | dependencies { |
新增Poko注解类
Poko.kt
1 | package com.example.ktspringboot1112.annotation |
声明plugin
build.gradle
1 | apply plugin: 'kotlin' |
创建User bean
User.kt
1 | package com.example.ktspringboot1112.bean |
创建 UserMapper
UserMapper.kt
1 | package com.example.ktspringboot1112.mapper |
创建mybatis-config.xml
resources/mybatis/mybatis-config.xml
1 | <?xml version="1.0" encoding="UTF-8" ?> |
创建user.xml
resources/mybatis/mapper/user.xml
1 | <?xml version="1.0" encoding="UTF-8" ?> |
创建UserService
UserService.kt1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17package com.example.ktspringboot1112.service
@Service
class UserService {
val logger: Logger = LoggerFactory.getLogger(javaClass)
@Autowired
lateinit var userMapper: UserMapper
fun getAllUser(): List<User> {
logger.info("service -> getAllUser")
val list = userMapper.getAllUser()
return list
}
}
创建UserController
UserController.kt
1 | package com.example.ktspringboot1112.controllers |
application配置
application.yml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17server:
port: 3000
spring:
datasource:
username: root
password: 233233
url: jdbc:mysql://localhost:3306/ktsdb?useSSL=false&serverTimezone=UTC
driver-class-name: com.mysql.jdbc.Driver
mybatis:
mapper-locations: classpath:mybatis/mapper/*.xml
config-location: classpath:mybatis/mybatis-config.xml
logging:
level:
com.example.ktspringboot1112.mapper: debug
数据库
创建 users 表
启动
启动spring boot, 访问 http://127.0.0.1:3000/users
添加拦截器
InterceptorConfig.kt
1 | package com.example.ktspringboot1112.config |
WebAppConfig.kt
1 | package com.example.ktspringboot1112.config |
UserController.kt
1 | package com.example.ktspringboot1112.controllers |
访问 http://127.0.0.1:3000/auth2
validation验证参数
UserMapper.kt1
2
3
4
5
6
7
8
9
10
11
12package com.example.ktspringboot1112.mapper
import com.example.ktspringboot1112.bean.User
import org.apache.ibatis.annotations.Mapper
@Mapper
interface UserMapper {
fun getAllUser(): List<User>
+++
fun findUserByNameAndPass(user: User): List<User>
+++
}
user.xml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--名称空间namespace指向接口EmployeeMapper-->
<mapper namespace="com.example.ktspringboot1112.mapper.UserMapper">
<select id="getAllUser" resultType="com.example.ktspringboot1112.bean.User">
SELECT * FROM users
</select>
+++
<select id="findUserByNameAndPass" resultType="com.example.ktspringboot1112.bean.User">
SELECT * FROM users WHERE username = #{username} AND password = #{password}
</select>
+++
</mapper>
UserService.kt1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39package com.example.ktspringboot1112.service
import com.example.ktspringboot1112.bean.User
import com.example.ktspringboot1112.mapper.UserMapper
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
@Service
class UserService {
@Autowired
lateinit var userMapper: UserMapper
val logger: Logger = LoggerFactory.getLogger(javaClass)
/**
* 查找全部用户
* @return List<User>
*/
fun getAllUser(): List<User> {
logger.info("SERVICE -> getAllUser")
val list = userMapper.getAllUser()
return list
}
+++
/**
* 根据用户名和密码查找用户
* @param user User
* @return List<User>
*/
fun findUserByNameAndPass(user: User): List<User> {
logger.info("SERVICE -> findUserByNameAndPass")
val list = userMapper.findUserByNameAndPass(user)
return list
}
+++
}
User.kt1
2
3
4
5
6
7
8
9
10
11
12
13
14
15package com.example.ktspringboot1112.bean
/**
* field标识符只允许在属性的访问器函数内使用。它能够 validation 校验注解作用与属性
*/
// 声明@Poko注解
@Poko
data class User(
var id: Int?,
@field:Size(min = 6, max = 12, message = "用户名在6-12字符之间")
@field:NotEmpty(message = "用户名不允许为空")
var username: String,
@field:NotEmpty(message = "密码不能为空")
@field:Size(min = 6, max = 12, message = "密码在6-12字符之间")
var password: String)
UserController.kt
1 | +++ |
在验证参数失败时, 会抛出 BindException 异常, 定义捕获 BindException 异常的类
BindExceptionHandler.kt1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24package com.example.ktspringboot1112.exception
/**
* 全局处理 BindException 异常
*/
// 声明@ControllerAdvice注解
@ControllerAdvice
class BindExceptionHandler {
val logger = LoggerFactory.getLogger(javaClass)
@ExceptionHandler(BindException::class)
@ResponseBody
fun handler(ex: BindException): Map<String, Any?> {
val fieldError: FieldError? = ex.getFieldError()
val message = fieldError?.defaultMessage
logger.error("BindExceptionHandler: 捕获到controller错误 -> ${message}")
val map = HashMap<String, Any?>()
map.put("message", message)
map.put("code", 0)
return map
}
}
设置validator为快速返回模式
ValidatorConfig.kt
1 | package com.example.ktspringboot1112.config |
post请求 /login
接口
验证密码的情况