无法对 MongoDB 使用弹簧验证 [重复]
Posted
技术标签:
【中文标题】无法对 MongoDB 使用弹簧验证 [重复]【英文标题】:Cannot use spring validation with MongoDB [duplicate] 【发布时间】: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
的列表。它已加载。
【参考方案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 那里得到了解决方案。无论如何谢谢你。以上是关于无法对 MongoDB 使用弹簧验证 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用 Hibernate OGM 的 MongoDb 身份验证