SpringBoot Validation + Kotlin校驗無效的解決方法

作者github主頁原文

DTO

package dawsonlee1790.springboot_validation_kotlin_demo.dto

import javax.validation.constraints.Max
import javax.validation.constraints.Pattern

/**
 * @author dawsonlee1790
 * @email dawsonlee1790@gamil.com
 * @date 2018-12-26
 */
data class LoginDTO(
        @field:Pattern(regexp = "[a-zA-Z0-9]+", message = "姓名只能由數字和大小寫字母組成")
        val name: String,
        @get:Max(18, message = "居然超過18歲了,可怕,不允許")
        val age: Int
)

/*
//============springboot validation 不生效============
data class LoginDTO(
        @Pattern(regexp = "[a-zA-Z0-9]+", message = "姓名只能由數字和大小寫字母組成")
        val name: String,
        @Max(18, message = "居然超過18歲了,可怕,不允許")
        val age: Int
)
*/

controller

package dawsonlee1790.springboot_validation_kotlin_demo.controller

import dawsonlee1790.springboot_validation_kotlin_demo.dto.LoginDTO
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.RequestMapping
import org.springframework.web.bind.annotation.RestController

/**
 * @author dawsonlee1790
 * @email dawsonlee1790@gamil.com
 * @date 2018-12-26
 */
@RestController
@RequestMapping("/loginController")
class LoginController {

    @PostMapping("/login")
    fun login(@RequestBody @Validated loginDTO: LoginDTO) {
        println("Hello ${loginDTO.name}!")
    }

}

原因分析

  • 在 java 中,將 validation 注解到實體類屬性或者 get/set 方法上,但是在 kotlin 中,屬性直接寫在構造函數中,validation 注解并沒有作用到屬性上。

解決方案

  • 使用 @field: 標識符,field標識符只允許在屬性的訪問器函數內使用。它能夠 validation 校驗注解作用與屬性。
  • 使用 @get: 標識符,表示注解用在屬性getter的方法上

項目源碼

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容