kotlin and @Valid Spring annotation

前端 未结 4 984
陌清茗
陌清茗 2020-12-13 18:21

I have an entity:

class SomeInfo(
        @NotNull @Pattern(regexp = Constraints.EMAIL_REGEX) var value: String) {
    var id: Long? = null
}
相关标签:
4条回答
  • 2020-12-13 18:39

    Seems Spring needs these annotations to be applied to a field. But Kotlin will apply these annotations to the constructor parameter. Use field: specifier when applying an annotation to make it apply to a field. The following code should work fine for you.

    class SomeInfo(
        @field:NotNull
        @field:Pattern(regexp = Constraints.EMAIL_REGEX)
        var value: String
    ) {
        var id: Long? = null
    }
    
    0 讨论(0)
  • 2020-12-13 18:40

    As an alternative to Michal's answer, annotating the getter also works.

    class SomeInfo(
        @get:NotNull
        @get:Pattern(regexp = Constraints.EMAIL_REGEX)
        var value: String
    ) {
        var id: Long? = null
    }
    

    The annoying part is, that not using @get: or @field: will annotate the constructor parameter. This is still valid kotlin code (so you don't get an error). It's just useless in these use cases.

    0 讨论(0)
  • 2020-12-13 18:49

    Also your rest controller should be marked by @Validated annotation

    0 讨论(0)
  • 2020-12-13 18:51

    If you use IntelliJ to convert Java to Kotlin, the @Valid annotation in the Spring Controller method may eventually be attached to the type, instead of the variable. This would break the validation.

    For example, the convertion could result in

    @PostMapping
    public Id create(@RequestBody someInfo: @Valid SomeInfo) {
        ...
    }
    

    This is not validating. The @Valid has to be moved to a variable like this:

    @PostMapping
    public Id create(@RequestBody @Valid someInfo: SomeInfo) {
        ...
    }
    
    0 讨论(0)
提交回复
热议问题