kotlin和@Valid Spring注释

fas*_*sth 24 spring spring-mvc kotlin

我有一个实体:

class SomeInfo(
        @NotNull @Pattern(regexp = Constraints.EMAIL_REGEX) var value: String) {
    var id: Long? = null
}
Run Code Online (Sandbox Code Playgroud)

和控制器方法:

@RequestMapping(value = "/some-info", method = RequestMethod.POST)
public Id create(@Valid @RequestBody SomeInfo someInfo) {
       ...
    }
Run Code Online (Sandbox Code Playgroud)

@Valid 注释不起作用.

看起来Spring需要一个默认的无参数构造函数,而上面的花哨代码变得像这样丑陋(但工作):

class SomeInfo() {

    constructor(value: String) {
            this.value = value
        }

        @NotNull @Pattern(regexp = Constraints.EMAIL_REGEX) 
        lateinit var value: String

        var id: Long? = null
    }
Run Code Online (Sandbox Code Playgroud)

有什么好的做法让它不那么罗嗦?

谢谢.

Mic*_*ael 66

看起来Spring需要将这些注释应用于字段.但是Kotlin会将这些注释应用于构造函数参数.field:应用注释时使用说明符使其适用于字段.以下代码应该适合您.

class SomeInfo(
    @field:NotNull
    @field:Pattern(regexp = Constraints.EMAIL_REGEX)
    var value: String
) {
    var id: Long? = null
}
Run Code Online (Sandbox Code Playgroud)


小智 7

作为Michal答案的替代方案,注释吸气剂也有效.

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

令人讨厌的部分是,不使用@get:或@field:将注释构造函数参数.这仍然是有效的kotlin代码(因此您不会收到错误).它在这些用例中毫无用处.


usr*_*r42 5

如果使用 IntelliJ 将 Java 转换为 Kotlin,则@ValidSpring Controller 方法中的注解可能最终会附加到类型上,而不是附加到变量上。这会破坏验证。

例如,转换可能导致

@PostMapping
public Id create(@RequestBody someInfo: @Valid SomeInfo) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

这不是验证。在@Valid必须移动到这样一个变量:

@PostMapping
public Id create(@RequestBody @Valid someInfo: SomeInfo) {
    ...
}
Run Code Online (Sandbox Code Playgroud)