gofor's blog

  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

Kotlin & Spring boot 使用@Valid校验无效解决方法

发表于 2017-04-12 更新于 2020-01-10 分类于 技术 阅读次数: Valine:

kotlin data (对应Java实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Entity
@Table(name = "user")
data class User(
@NotNull(message = "用户名不能为空")
@Column(name = "user_name", nullable = false)
var userName: String = "",

@NotNull(message = "用户ID不能为空")
@Column(name = "user_id", unique = true)
var userId: String = "",

@Email(message = "无效的邮箱")
var email: String = "",

@Column(nullable = false)
var password: String = ""

) : Serializable

再来看controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@RestController
@RequestMapping("/user")
class UserController {

@Autowired lateinit var userRepository: UserRepository

@PutMapping(value = "/put",
consumes = arrayOf(MediaType.APPLICATION_JSON_UTF8_VALUE))
fun put(@Valid @RequestBody user: SysUser): ResponseEntity<SysUser>? {
if (result.hasErrors()) {
val fieldErrors = result.fieldErrors
for (fieldError in fieldErrors) {
println("${fieldError.defaultMessage}")
}
return fieldErrors
}
println(user)
return ResponseEntity
.ok()
.cacheControl(CacheControl.maxAge(30, TimeUnit.DAYS))
.eTag("AC")
.body(user)
}
}

调用put方法,@Valid校验无效

原因分析:

在 java 中,将 validation 注解到实体类属性或者 get/set 方法上,但是在 kotlin 中,属性直接写在构造函数中,validation 注解并没有作用到属性上。

解决方法:

使用 @field: 标识符,field标识符只允许在属性的访问器函数内使用。它能够 validation 校验注解作用与属性。

将 kotlin data class 稍作修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Entity
@Table(name = "user")
data class User(
@field:NotNull(message = "用户名不能为空")
@Column(name = "user_name", nullable = false)
var userName: String = "",

@field:NotNull(message = "用户ID不能为空")
@Column(name = "user_id", unique = true)
var userId: String = "",

@field:NotBlank(message = "邮箱不能为空")
@field:Email(message = "无效的邮箱")
var email: String = "",

@field:NotBlank(message = "密码不能为空")
@Column(nullable = false)
var password: String = ""

) : Serializable

之后,@Valid校验即可正常工作

再次执行

1
curl -v http://localhost:8080/user/put11

@Valid正常工作

1
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
{
"timestamp": "2017-03-04 13:54:19",
"status": 400,
"error": "Bad Request",
"exception": "org.springframework.web.bind.MethodArgumentNotValidException",
"errors": [
{
"field": "userId",
"rejectedValue": null,
"bindingFailure": false,
"objectName": "sysUser",
"codes": [
"NotNull.sysUser.userId",
"NotNull.userId",
"NotNull.java.lang.String",
"NotNull"
],
"arguments": [
{
"codes": [
"sysUser.userId",
"userId"
],
"arguments": null,
"defaultMessage": "userId"
}
],
"defaultMessage": "用户ID不能为空"
}
],
"message": "Validation failed for object='sysUser'. Error count: 1",
"path": "/user/put"
}
  • 本文作者: gofor
  • 本文链接: https://acehjm.github.io/2017/04/12/Kotlin-Spring-boot-使用-Valid校验无效解决方法/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
# kotlin # springboot
Hibernate自定义类型
spring boot custom HttpMessageConverter with kotlin
gofor

gofor

Programming technology
14 日志
4 分类
14 标签
RSS
GitHub StackOverflow
Creative Commons
© 2016 – 2020 gofor
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Pisces v7.3.0
0%