Kotlin spring boot @RequestBody 验证未触发
Kotlin spring boot @RequestBody validation is not triggered
我在使用
验证@RequestBody 的项目中遇到问题
implementation("org.springframework.boot:spring-boot-starter-validation")
我的 DTO 如下所示:
import javax.validation.constraints.Email
import javax.validation.constraints.Pattern
class LoginDto(
@Email
val email: String,
@Pattern(regexp = Constants.PASSWORD_REGEX)
val password: String
)
控制器看起来像这样:
import org.springframework.validation.annotation.Validated
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RestController
import javax.validation.Valid
@RestController
@Validated
class AuthController(private val authService: AuthService) {
@PostMapping("login")
fun login(@Valid @RequestBody loginDto: LoginDto): LoginResponse {
return authService.login(loginDto)
}
...
}
如果我尝试传递无效数据,验证不会出错:
{
"password":"hello",
"email":"dfdfdfdf"
}
我没有收到任何错误
我使用 Exposed 而不是 jpa 但我认为这与问题无关
您应该将 @email
和 @Pattern
的注释更改为 @field:Email
和 @field:Pattern
例如。
这样做的原因有两个,一方面,您将注释放在 Kotlin 属性上,并且可以通过多种方式访问 Kotlin 属性。因此,您需要指定要如何访问 属性 以应用注释。另一方面,注解有一组预定义的目标。您可以检查注释以查看它是否具有字段目标。这就是为什么我们可以使用 @field:Pattern
和 @field:Email
.
这是与 java 的主要区别,后者具有不同的 getter、setter 和字段。
我在使用
验证@RequestBody 的项目中遇到问题implementation("org.springframework.boot:spring-boot-starter-validation")
我的 DTO 如下所示:
import javax.validation.constraints.Email
import javax.validation.constraints.Pattern
class LoginDto(
@Email
val email: String,
@Pattern(regexp = Constants.PASSWORD_REGEX)
val password: String
)
控制器看起来像这样:
import org.springframework.validation.annotation.Validated
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RestController
import javax.validation.Valid
@RestController
@Validated
class AuthController(private val authService: AuthService) {
@PostMapping("login")
fun login(@Valid @RequestBody loginDto: LoginDto): LoginResponse {
return authService.login(loginDto)
}
...
}
如果我尝试传递无效数据,验证不会出错:
{
"password":"hello",
"email":"dfdfdfdf"
}
我没有收到任何错误 我使用 Exposed 而不是 jpa 但我认为这与问题无关
您应该将 @email
和 @Pattern
的注释更改为 @field:Email
和 @field:Pattern
例如。
这样做的原因有两个,一方面,您将注释放在 Kotlin 属性上,并且可以通过多种方式访问 Kotlin 属性。因此,您需要指定要如何访问 属性 以应用注释。另一方面,注解有一组预定义的目标。您可以检查注释以查看它是否具有字段目标。这就是为什么我们可以使用 @field:Pattern
和 @field:Email
.
这是与 java 的主要区别,后者具有不同的 getter、setter 和字段。