Пожалуйста, используйте 'MongoMappingContext # setAutoIndexCreation (boolean)' или переопределите "MongoConfigurationSupport # autoIndexCreation ()", чтобы быть явным - PullRequest
6 голосов
/ 31 января 2020

Я прошел через https://docs.spring.io/spring-data/mongodb/docs/2.2.0.RC1/reference/html/#mapping -usage и другие источники в Интернете, но решение не сработало для меня.

Я использую Spring Boot 2.2.2.RELEASE и Spring Data Mongo. В этом примере на уровне поля Модель / Pojo Мы используем

@Indexed(name = AppConstants.FIRSTNAME_INDEX, direction = IndexDirection.ASCENDING)
private String firstName;

Ошибка:

Please use 'MongoMappingContext#setAutoIndexCreation(boolean)' or override 'MongoConfigurationSupport#autoIndexCreation()' to be explicit.
However, we recommend setting up indices manually in an application ready block. You may use index derivation there as well.

> -----------------------------------------------------------------------------------------
> @EventListener(ApplicationReadyEvent.class)
> public void initIndicesAfterStartup() {
>
>     IndexOperations indexOps = mongoTemplate.indexOps(DomainType.class);
>
>     IndexResolver resolver = new MongoPersistentEntityIndexResolver(mongoMappingContext);
>     resolver.resolveIndexFor(DomainType.class).forEach(indexOps::ensureIndex);
> }
> -----------------------------------------------------------------------------------------

Как предложено в журнале, я реализовал, но я не вижу метод setAutoIndexCreation.

public class MongoConfig extends AbstractMongoClientConfiguration {

    @Override
    public MongoClient mongoClient() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    protected String getDatabaseName() {
        // TODO Auto-generated method stub
        return null;
    }
}

Ответы [ 3 ]

14 голосов
/ 01 февраля 2020

Отключить автоматическое создание индекса в файле application.properties

spring.data.mongodb.auto-index-creation=false

или в файле application.yml

spring:
  data:
    mongodb:
      auto-index-creation: false

Создать класс MongoConfiguration whit @Configuration annotation

Injet c это зависимости

private final MongoTemplate mongoTemplate;
private final MongoConverter mongoConverter;

и добавьте этот метод

@EventListener(ApplicationReadyEvent.class)
public void initIndicesAfterStartup() {

    log.info("Mongo InitIndicesAfterStartup init");
    var init = System.currentTimeMillis();

    var mappingContext = this.mongoConverter.getMappingContext();

    if (mappingContext instanceof MongoMappingContext) {
        MongoMappingContext mongoMappingContext = (MongoMappingContext) mappingContext;
        for (BasicMongoPersistentEntity<?> persistentEntity : mongoMappingContext.getPersistentEntities()) {
            var clazz = persistentEntity.getType();
            if (clazz.isAnnotationPresent(Document.class)) {
                var resolver = new MongoPersistentEntityIndexResolver(mongoMappingContext);

                var indexOps = mongoTemplate.indexOps(clazz);
                resolver.resolveIndexFor(clazz).forEach(indexOps::ensureIndex);
            }
        }
    }

    log.info("Mongo InitIndicesAfterStartup take: {}", (System.currentTimeMillis() - init));
}

помните, что var только для java 11 +

Последний класс, который использует Ломбок

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.MongoConverter;
import org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexResolver;
import org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;


@Slf4j
@RequiredArgsConstructor
@Configuration
public class MongoConfiguration {

private final MongoTemplate mongoTemplate;

private final MongoConverter mongoConverter;

@EventListener(ApplicationReadyEvent.class)
public void initIndicesAfterStartup() {

        log.info("Mongo InitIndicesAfterStartup init");
        var init = System.currentTimeMillis();

        var mappingContext = this.mongoConverter.getMappingContext();

        if (mappingContext instanceof MongoMappingContext) {
            MongoMappingContext mongoMappingContext = (MongoMappingContext) mappingContext;
            for (BasicMongoPersistentEntity<?> persistentEntity : mongoMappingContext.getPersistentEntities()) {
                var clazz = persistentEntity.getType();
                if (clazz.isAnnotationPresent(Document.class)) {
                    var resolver = new MongoPersistentEntityIndexResolver(mongoMappingContext);

                    var indexOps = mongoTemplate.indexOps(clazz);
                    resolver.resolveIndexFor(clazz).forEach(indexOps::ensureIndex);
                }
            }
        }

        log.info("Mongo InitIndicesAfterStartup take: {}", (System.currentTimeMillis() - init));
    }

}
0 голосов
/ 21 февраля 2020

пробовал со следующей конфигурацией, я даже создал собственный bean-компонент mappingContext

@Configuration
public class MongoConfiguration extends AbstractMongoClientConfiguration {

    private final AbstractCloudConfig abstractCloudConfig;

    @Autowired
    public MongoConfiguration(AbstractCloudConfig abstractCloudConfig) {
        this.abstractCloudConfig = abstractCloudConfig;
    }

    @Override
    public MongoClient mongoClient() {
        return MongoClients.create(MongoClientSettings.builder().build());
    }

    @Bean
    @Override
    public MongoDbFactory mongoDbFactory() {
        return abstractCloudConfig.connectionFactory().mongoDbFactory();
    }

    @Bean
    public MappingMongoConverter mongoConverter(MappingMongoConverter mongoConverter) {
        /*
         * For some obscure reason, Spring Mongo does not like hash maps with keys that contain dots '.'.
         * We configure to replace dots '.' in maps with some obscure character that does not occur in in keys.
         */
        mongoConverter.setMapKeyDotReplacement("~");
        return mongoConverter;
    }

    @Bean
    public MongoMappingContext mongoMappingContext() throws ClassNotFoundException {
        MongoMappingContext mappingContext = new MongoMappingContext();
        mappingContext.setInitialEntitySet(this.getInitialEntitySet());
        mappingContext.setSimpleTypeHolder(this.customConversions().getSimpleTypeHolder());
        mappingContext.setFieldNamingStrategy(this.fieldNamingStrategy());
        mappingContext.setAutoIndexCreation(false);
        return mappingContext;
    }

    @Override
    protected String getDatabaseName() {
        throw new RuntimeException("This method should not be called");
    }

    @EventListener(ApplicationReadyEvent.class)
    public void initIndicesAfterStartup() throws ClassNotFoundException {
        MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory());
        this.mongoMappingContext().setAutoIndexCreation(false);
        createIndexForEntity(DataSetDefinitionV2.class, mongoTemplate);
        createIndexForEntity(ModelConfiguration.class, mongoTemplate);
        createIndexForEntity(ScheduleEntity.class, mongoTemplate);
    }

    private void createIndexForEntity(Class<?> entityClass, MongoTemplate mongoTemplate) throws ClassNotFoundException {
        IndexOperations indexOps = mongoTemplate.indexOps(entityClass);
        IndexResolver resolver = new MongoPersistentEntityIndexResolver(this.mongoMappingContext());
        resolver.resolveIndexFor(entityClass).forEach(indexOps::ensureIndex);
    }
}

, но предупреждение все еще приходит. Я попытался событие spring.data.mongodb.auto-index-creation = false в application.properties тоже не повезло

0 голосов
/ 14 февраля 2020

Но решение не работает хорошо, по крайней мере, в контексте реагирования. mongoMappingContext.getPersistentEntities() пуст в это время. Только auto-index-creation: true (или даже mongoMappingContext.setAutoIndexCreation(true)) обеспечивают создание индексов.

...