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代码(因此您不会收到错误).它在这些用例中毫无用处.
如果使用 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)
| 归档时间: |
|
| 查看次数: |
6975 次 |
| 最近记录: |