无法对 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 使用弹簧验证 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 ldap 获得具有弹簧安全性的权限

使用 Hibernate OGM 的 MongoDb 身份验证

在没有弹簧身份验证的情况下通过 web-socket 多次回复

弹簧靴。请求无法到达控制器

如何从控制器调用身份验证 - 弹簧安全核心插件

如何在反应弹簧中使用 Javers?