Определить проверку схемы Mongo с помощью Spring - PullRequest
0 голосов
/ 04 мая 2018

Я хочу определить коллекцию в Mongo, используя Spring-boot с опцией валидатора JSON Schema (https://docs.mongodb.com/manual/core/schema-validation/#json-schema), Я не хочу валидации бина JSR-303 (это не действительный ответ Spring data mongoDb не является нулевой аннотацией, как Spring data Jpa ), но определяет, в момент создания Collection, параметр, который отображается в JSON с помощью CollectionInfos () .

Пример, если я определяю лайки класса модели Account:

public class Account {

@Id
private String id;

private String name;

private String surname;

@NotNull
private String username;
}

Я хочу, чтобы коллекция, используя db.getCollectionInfos () , json любит:

[
{
    "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 = create , потому что она определяет правила на уровне схемы и не похожа на валидатор Bean, который определяет правила на уровне приложения. .

1 Ответ

0 голосов
/ 29 марта 2019

JsonSchema поддерживается Spring Data MongoDB начиная с версии 2.1. Пожалуйста, см. Справочная документация для деталей. Вы можете использовать конструктор, как показано ниже, для определения вашей схемы.

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

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

На момент написания статьи создание схемы json из типа домена не поддерживается. Однако вы можете присоединиться к обсуждению DATAMONGO-1849 и / или попробовать снимки PR # 733 .

Предложение превратит DomainType в MongoJsonSchema, вызвав что-то вроде MongoJsonSchema schema = schemaCreator.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' }
     }
}
...