【问题标题】:kotlin constructor / spring mvc validationkotlin 构造函数/spring mvc 验证
【发布时间】:2018-08-08 13:40:14
【问题描述】:

我有这个 kotlin 数据类:

data class Message(
    @field:NotEmpty
    val from: String?,
    @field:NotEmpty
    val to: List<String>?,
    @field:NotEmpty
    val subject: String?,
    val cc: List<String>?
)

当我使用 spring mvc api 创建消息时:

@PostMapping("/messages")
@ResponseStatus(HttpStatus.CREATED)
fun create(@Valid message: Message) = service.create(message)

使用以下数据:

{
   "subject": "this is a test",
   "from": "test@test.com",
   "to": ["test@test.com"],
   "cc": []
}

我得到了 3 个org.springframework.validation.BindException。 似乎验证发生在 Message 对象的实例化和其属性的设置之间。

谁能解释一下在这种情况下发生了什么以及如何进行验证/实例化?

【问题讨论】:

  • 您是否使用Hibernate validator 进行验证并使用Jackson for Kotlin 进行JSON 解析?
  • 是 Kotlin 的 Hibernate 验证器和 Jackson
  • 一般来说,Jackson 会解析并实例化message,然后 Spring(在调用控制器的方法之前)将其传递给 Hibernate 验证器进行验证。您能否提供有关该异常的更多详细信息?
  • [...] BindException [...] 字段“来自”的对象“消息”中的字段错误:拒绝值 [null]; [...]字段'to'上的对象'message'中的字段错误:拒绝值[null]; [...] 字段“主题”上的对象“消息”中的字段错误:拒绝值 [null];
  • 如果你说的是真的,那为什么我在 kotlin jackson mapping 之后有这个对象?消息(来自=null,to=null,主题=null,cc=null)

标签: spring validation spring-mvc kotlin


【解决方案1】:

当你使用@Valid 时,spring boot validate javax && hibernate 验证。如果您不想验证,请删除 @Valid。还缺少@RequestBody

有验证:

@PostMapping("/messages")
@ResponseStatus(HttpStatus.CREATED)
fun create(@Valid @RequestBody message: Message) = service.create(message)

未经验证:

@PostMapping("/messages")
@ResponseStatus(HttpStatus.CREATED)
fun create(@RequestBody message: Message) = service.create(message)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    • 1970-01-01
    • 2019-01-10
    相关资源
    最近更新 更多