我有一个实体:
class SomeInfo(
@NotNull @Pattern(regexp = Constraints.EMAIL_REGEX) var value: String) {
var id: Long? = null
}
和控制器方法:
@RequestMapping(value = "/some-info", method = RequestMethod.POST)
public Id create(@Valid @RequestBody SomeInfo someInfo) {
...
}
@Valid
注释不起作用。
看起来Spring需要一个默认的无参数构造函数,而上面的花哨代码变得像这样丑陋(但工作):
class SomeInfo() {
constructor(value: String) {
this.value = value
}
@NotNull @Pattern(regexp = Constraints.EMAIL_REGEX)
lateinit var value: String
var id: Long? = null
}
有什么好的做法可以减少罗嗦?
感谢。
答案 0 :(得分:52)
似乎Spring需要将这些注释应用于字段。但是Kotlin会将这些注释应用于构造函数参数。应用注释时使用field:
说明符使其适用于字段。以下代码应该可以正常使用。
class SomeInfo(
@field:NotNull
@field:Pattern(regexp = Constraints.EMAIL_REGEX)
var value: String
) {
var id: Long? = null
}
答案 1 :(得分:6)
作为Michal答案的替代方案,注释吸气剂也有效。
class SomeInfo(
@get:NotNull
@get:Pattern(regexp = Constraints.EMAIL_REGEX)
var value: String
) {
var id: Long? = null
}
令人讨厌的部分是,不使用@get:或@field:将注释构造函数参数。这仍然是有效的kotlin代码(因此您不会收到错误)。它在这些用例中毫无用处。
答案 2 :(得分:0)
如果使用IntelliJ将Java转换为Kotlin,Spring Controller方法中的@Valid
批注可能最终会附加到类型上,而不是变量上。这会破坏验证。
例如,转换可能会导致
@PostMapping
public Id create(@RequestBody someInfo: @Valid SomeInfo) {
...
}
这没有验证。 @Valid
必须移至这样的变量:
@PostMapping
public Id create(@RequestBody @Valid someInfo: SomeInfo) {
...
}
答案 3 :(得分:0)
此外,您的rest控制器也应标上@Validated
注释
答案 4 :(得分:0)
如果您正在验证电子邮件地址,您也可以这样写:
import javax.validation.constraints.Email
import javax.validation.constraints.Size
data class User(
val id: Long,
@field:Size(min = 2)
val firstName: String,
@field:Size(min = 2)
val lastName: String,
@field:Email
val email: String,
..)
答案 5 :(得分:0)
对于原语的功能验证:
@Validated
class MyClass() {
fun myFun(@Valid @NotEmpty @Size(min = 3, max = 30) name: String) {
}
}