kotlin和@Valid Spring注释

时间:2016-04-09 09:39:10

标签: spring spring-mvc kotlin

我有一个实体:

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
    }

有什么好的做法可以减少罗嗦?

感谢。

6 个答案:

答案 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) {
  }
}