【问题标题】:Cannot use spring validation with MongoDB [duplicate]无法对 MongoDB 使用弹簧验证 [重复]
【发布时间】:2017-04-02 17:36:38
【问题描述】:

我在 Kotlin 中寻找春季验证数据模型的解决方案。但我不能。 以下是标签data class

data class Tag(@field:NotNull var name: String) {
    lateinit @Id var id: ObjectId
}

我已启用配置以使用 bean 验证

@Configuration
open class ValidatorConfig {
    @Bean
    open fun validator() = LocalValidatorFactoryBean()
}

据我所知,Spring Boot 会自动加载所有 Bean 配置。在运行时,当使用空 Json POST 时,应该会抛出正确的验证错误,但会抛出以下错误

Instantiation of [simple type, class kagaz.sano.model.Tag] value failed for
JSON property name due to missing (therefore NULL) value for creator parameter 
name which is a non-nullable type\n at [Source:
org.apache.catalina.connector.CoyoteInputStream@66f3b65c; line: 3, column: 1]
(through reference chain: kagaz.sano.model.Tag[\"name\"])

【问题讨论】:

  • 您的属性是字符串类型。所以 Kotlin 不允许你在其中存储 null,然后让验证器检查它是否为 null。你需要字符串吗?为此。
  • 但是当我使用 String? 时,数据未经任何验证就存储在 DB 中。
  • 你确定配置已经加载了吗?触发验证的代码/注释在哪里?
  • 是的,配置已加载。我在上下文中浏览了beanDefinitionNames 的列表。它已加载。

标签: spring mongodb kotlin bean-validation


【解决方案1】:

Spring 通过检查其字段或属性值来验证objects。要验证object,您需要先创建它。当 json 反序列化器尝试解析输入并创建 Tag 实例时,它会遇到并报告问题:

[simple type, class kagaz.sano.model.Tag] 值的实例化失败 JSON 属性名称

为了让 Spring Validation 开始其工作需要一个对象实例 - 即使它无效

这意味着您需要允许 json 反序列化器创建一个处于无效状态的对象,以便验证器可以像这样检查它:

data class TagDto(@get:NotNull var name: String? = null) {
    @get:NotNull var id: ObjectId? = null
}

【讨论】:

  • 我尝试了你的解决方案,但是当我给出一个空的 POST 时,它只是绕过了验证并存储了记录。
  • @SharadCodes 请告诉我你的控制器方法
  • 显然问题出在 mongodb 上。所以,我从here 那里得到了解决方案。无论如何谢谢你。
猜你喜欢
  • 2019-11-15
  • 2023-03-24
  • 2017-03-31
  • 2014-11-06
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多