【问题标题】:Validator does not work with Kotlin Spring Boot app验证器不适用于 Kotlin Spring Boot 应用程序
【发布时间】:2022-02-02 00:28:31
【问题描述】:

问题

在运行时似乎没有引用 Kotlin Spring Boot Web 项目的验证注释。

@Min(18)
val age: Int? = null

预期结果

如果不满足指定的验证条件,带注释的字段应该抛出错误。

网上有很多关于类似问题的问题,但答案似乎无法解决这个问题。

建议通常使用“get”或“field”作为注释 - 例如

@field:Min(18)
val age: Int? = null

问题再现

要了解为什么这不适用于 Kotlin,我使用本教程对 Kotlin 与 Java 进行了比较:

https://spring.io/guides/gs/validating-form-input/

我在这里创建了一个 Java 应用程序:

https://github.com/lgviii/JavaSpringValidations

我在这里关心 Kotlin 中的同一个应用程序:

https://github.com/lgviii/KotlinSpringValidations

Java 应用会验证在端口 8080 上运行的网页中的输入,但 Kotlin 应用不会。所以唯一的区别似乎是语言......


问题

  1. 为什么 Java 应用程序可以开箱即用,而 Kotlin 却不能?
  2. 需要在 Kotlin Spring Boot 验证器模板项目中添加什么才能获取
    验证器来获取项目的 Java 版本中的注释?

【问题讨论】:

    标签: spring kotlin


    【解决方案1】:

    在您的 Kotlin 示例项目中,@Valid 注释的位置不正确。你使用:

    personForm: @Valid PersonForm?
    

    这是将注释放在类型上,详细描述了here的机制。您没有注释参数本身,这是 Spring MVC 期望触发验证的内容。这是可能的,因为验证 API 的 @Valid 被定义为在该位置可用。如果您尝试在该位置使用其他仅限参数的注解,例如 @ModelAttribute,编译器将拒绝该注解。

    要解决问题,请切换到以下声明:

    @Valid personForm: PersonForm?
    

    这注释了参数,Spring MVC 触发验证,并且请求发送不充分的数据会按预期重定向到表单。

    或者,您可以使用 Spring 的 @Validated 注释代替 JSR-303 的 @Valid。在这种情况下,它基本上以相同的方式工作,但可以防止错位,因为它不能用作类型使用注释。

    【讨论】:

    • 行得通,谢谢!
    【解决方案2】:

    正如this article所解释的:

    "如果不指定使用站点目标,则根据正在使用的注解的@Target注解选择目标。如果有多个适用目标,则使用以下列表中的第一个适用目标:参数、属性、字段。

    更多信息请关注kotlin documentation

    【讨论】:

      猜你喜欢
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      • 2023-03-19
      • 2020-11-22
      • 1970-01-01
      • 2021-05-29
      相关资源
      最近更新 更多