当前位置: 首页 > 知识库问答 >
问题:

使用Spring定义Mongo模式验证

盖夕
2023-03-14

我想使用Spring boot和JSON模式验证器选项在Mongo中定义一个集合(https://docs.mongodb.com/manual/core/schema-validation/#html" target="_blank">json-模式),我不想要JSR-303 Bean验证(这不是一个有效的答案Spring data mongoDb not null注释,就像Spring data Jpa一样),但在创建集合时,使用CollectionFos()定义JSON中显示的选项。

例如,如果我定义一个帐户模型类喜欢:

public class Account {

@Id
private String id;

private String name;

private String surname;

@NotNull
private String username;
}

我希望集合中有,使用db。GetCollectionFos(),一个类似于:

[
{
    "name" : "account",
    "type" : "collection",
    "options" : {
        "validator" : {
            "$jsonSchema" : {
                "bsonType" : "object",
                "required" : [ 
                    "username"
                ]
            }
        }
    },
    "info" : {
        "readOnly" : false,
        "uuid" : UUID("979cdc4b-d6f3-4aef-bc89-3eee812773a5")
    },
    "idIndex" : {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "databaseName.account"
    }
}
]

该过程可能类似于spring.jpa.hibernate.ddl-auto=cread,因为它在模式级别定义规则,而不类似于在应用程序级别定义规则的Bean验证器。

共有1个答案

林英朗
2023-03-14

2.1版起,Spring Data MongoDB支持JsonSchema。有关详细信息,请参阅参考文档。您可以使用下面这样的生成器来定义模式。

MongoJsonSchema schema = MongoJsonSchema.builder()
    .required("username")
    .properties(JsonSchemaProperty.string("username"))
    .build();

template.createCollection("account", CollectionOptions.empty().schema(schema));

在编写json模式时,不支持从域类型创建json模式。不过,你可能想加入讨论DATAMONGO-1849和/或尝试一下PR#733的快照。

该建议通过调用类似于MongoJsonSchema schema=schemaCreator的东西,将DomainType转换为MongoJsonSchema。createSchemaFor(DomainType.class)

public class DomainType {

    private final String requiredCtorArg;
    private final @Nullable String nullableCtorArg;
    private String optionalArg;

    public DomainType(String requiredCtorArg, @Nullable String nullableCtorArg) {

        this.requiredCtorArg = requiredCtorArg;
        this.nullableCtorArg = nullableCtorArg;
    }

    // gettter / setter omitted 
}
{
    'type' : 'object',
    'required' : ['requiredCtorArg'],
    'properties' : {
        'requiredCtorArg' : { 'type' : 'string' },
        'nullableCtorArg' : { 'type' : 'string' },
        'optionalArg' : { 'type' : 'string' }
     }
}

 类似资料:
  • 我正在寻找一个解决方案来解决Swagger(OpenAPI)数据类型和JSON模式之间处理数据类型空值的不兼容性。 我们的swagger文件包含所有模式定义,我想使用JSON。Net模式,用于API测试中的模式验证步骤。 有效的swagger属性定义: 将失败JSON模式验证空值()。 如果我将可为空的属性定义替换为: 对于空值,验证将是成功的,但这打破了昂首阔步的语法。 我找不到的OpenAPI

  • 我想确保在创建新用户名或更新用户名时,用户名是唯一的。我写了下面的代码,它可以很好地创建和更新用户名。但是,如果只更新其他用户字段,如年龄或性别,并保留相同的用户名,它将返回invalid,因为用户名已经存在。 重要的是,我想要的验证是使用BindingResault。我已经有一个数据库,将用户名视为唯一的限制。但是现在我想要用BindingResault进行同样的验证。但是我更新用户时的方式会导

  • 我有一个spring data mongo存储库类 在测试配置中,我使用EnableMongoRepositories注释 原因:org.springframework.beans.factory.nosuchbeandefinitionexception:在org.springframework.beans.factory.support.defaultlistablebeanfactory.g

  • 问题内容: 我想注册一个可以处理以下处理程序方法定义的自定义 我可以注册我的解析器,这只是创建了一个通过重写通过请求参数对象,从。当Spring尝试解析该参数时,它将遍历其列表(有很多),并选择它的第一个。 在上面的例子中,虽然我的解析器将被调用,我的论点将得到初始化,注释将不会被处理 ,并 为解析器,一个是因为它需要一个会失败,或在处理方法的说法,这我不没有。 如果我尝试通过添加来修复它 一实施

  • 问题内容: 我在这里尝试了答案中的步骤:HibernateValidator,自定义ResourceBundleLocator和Spring 但是仍然只是作为输出而不是消息。 dispatcher-servlet.xml /WEB-INF/validationMessages.properties: 表格(上课地点) 这是怎么了 问题答案: 得到它了!:-) 我在我的计算机中添加了以下bean而不

  • 我正在构建一个Spring Boot应用程序,并试图为我将在服务层验证的一些DTO/实体实现自定义验证。基于Spring关于这个问题的文档,我认为一种方法是实现org。springframework。验证。验证程序界面。 作为一个最小、完整、可重复的示例,请考虑以下代码: Spring初始化引导项目 在src/main/java/com中添加了以下代码。实例使用验证: 如果我点击endpoint触