【问题标题】:While migrating Springboot from 2.1.0 to 2.2.1 having Mongo error将 Springboot 从 2.1.0 迁移到 2.2.1 时出现 Mongo 错误
【发布时间】:2020-04-23 22:09:28
【问题描述】:

Springboot 2.2.1 版 从 2.1.0 迁移时

引起:java.lang.NullPointerException at org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:2902) 在 org.springframework.data.mongodb.core.MultiTenancyMongoTemplate.execute(MultiTenancyMongoTemplate.java:81) 在 org.springframework.data.mongodb.core.MultiTenancyMongoTemplate.execute(MultiTenancyMongoTemplate.java:54) 在 org.springframework.data.mongodb.core.DefaultIndexOperations.execute(DefaultIndexOperations.java:214) 在 org.springframework.data.mongodb.core.DefaultIndexOperations.ensureIndex(DefaultIndexOperations.java:121) 在 org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator.createIndex(MongoPersistentEntityIndexCreator.java:158) 在 org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator.checkForAndCreateIndexes(MongoPersistentEntityIndexCreator.java:148) 在 org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator.checkForIndexes(MongoPersistentEntityIndexCreator.java:130) 在 org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator.(MongoPersistentEntityIndexCreator.java:95) 在 org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator.(MongoPersistentEntityIndexCreator.java:72) 在 org.springframework.data.mongodb.core.MongoTemplate.(MongoTemplate.java:275) 在 org.springframework.data.mongodb.core.MultiTenancyMongoTemplate.(MultiTenancyMongoTemplate.java:33) 在 ApplicationsMongoTemplate.(ApplicationsMongoTemplate.java:21) 在 MongoConfiguration.mongoOperations(MongoConfiguration.java:53) 在 MongoConfiguration$$EnhancerBySpringCGLIB$$dc35c2c4.CGLIB$mongoOperations$1() 在 MongoConfiguration$$EnhancerBySpringCGLIB$$dc35c2c4$$FastClassBySpringCGLIB$$b7e97015.invoke() 在 org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) 在 org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363) 在 MongoConfiguration$$EnhancerBySpringCGLIB$$dc35c2c4.mongoOperations() 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native 方法)在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 在 org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ... 122 更多

@Configuration
@EnableMongoRepositories(basePackages = "repositories", mongoTemplateRef = "mongoOperations")
public class MongoConfiguration {

    private final MongoClientOptions options;
    private final MongoClientFactory factory;

    public MongoConfiguration(MongoProperties properties,
                                  ObjectProvider<MongoClientOptions> options, Environment environment) {
        this.options = options.getIfAvailable();
        this.factory = new MongoClientFactory(properties, environment);
    }

    @Bean(destroyMethod = "close")
    public MongoClient mongo() {
        return this.factory.createMongoClient(this.options);
    }

    @Bean
    public ValidatingMongoEventListener validatingMongoEventListener() {
        return new ValidatingMongoEventListener(validator());
    }

    @Bean
    public LocalValidatorFactoryBean validator() {
        return new LocalValidatorFactoryBean();
    }

    @Bean
    public MongoOperations mongoOperations(final ShareContextMongoDbFactory mongoDbFactory, final MongoConverter mongoConverter) {
        return new ApplicationsMongoTemplate(mongoDbFactory, mongoConverter);
    }

    @Bean
    public ShareContextMongoDbFactory mongoDbFactory(final MongoClient mongoClient, final MongoProperties mongoProperties) {
        return new ShareContextMongoDbFactory(mongoClient, mongoProperties.getDatabase());
    }

}
public class ApplicationsMongoTemplate extends MultiTenancyMongoTemplate implements
    ApplicationEventPublisherAware {

  private ApplicationEventPublisher applicationEventPublisher;

  public ApplicationsMongoTemplate(
      ShareContextMongoDbFactory mongoDbFactory,
      MongoConverter mongoConverter) {
    super(mongoDbFactory, mongoConverter);
  }

  /**
   * Remove the given object from the collection by id.
   *
   * @param object must not be {@literal null}.
   * @return the {@link DeleteResult} which lets you access the results of the previous delete.
   */

  @Override
  @NonNull
  public DeleteResult remove(Object object) {
    Assert.notNull(object, "Object must not be null!");
    applicationEventPublisher.publishEvent(new BeforeDeleteEvent(object));
    return super.remove(object);
  }

  @Override
  public void setApplicationEventPublisher(
      @NonNull ApplicationEventPublisher applicationEventPublisher) {
    this.applicationEventPublisher = applicationEventPublisher;
  }
}

build.gradle dependecies

dependencies {
    compile "org.springframework.cloud:spring-cloud-starter-openfeign"
    compile "org.springframework.boot:spring-boot-starter-cache"
    compile "org.springframework.boot:spring-boot-starter-actuator"
    compile "org.springframework.boot:spring-boot-starter-data-mongodb"
    compile "org.springframework.boot:spring-boot-starter-security"
    compile "org.springframework.boot:spring-boot-starter-validation"
    compile "org.springframework.boot:spring-boot-starter-websocket"
    compile "org.springframework.boot:spring-boot-starter-web"
    compile "org.springframework.boot:spring-boot-starter-aop"
    compile "org.springframework.boot:spring-boot-starter-amqp"
    compileOnly "org.springframework.boot:spring-boot-configuration-processor"
    testCompile "org.springframework.boot:spring-boot-starter-test"
    testCompile "org.openjdk.jmh:jmh-core:${jmh_version}"
    testCompile "org.openjdk.jmh:jmh-generator-annprocess:${jmh_version}"
    testCompile "org.powermock:powermock-module-junit4:${powermock_version}"
    testCompile "org.powermock:powermock-api-mockito2:${powermock_version}"
    testCompile "org.mockito:mockito-core:2.18.3"
    testCompile "commons-beanutils:commons-beanutils:1.9.4"
}

【问题讨论】:

    标签: java mongodb spring-boot microservices multi-tenant


    【解决方案1】:

    从我发现的日志中,索引未在您的 Spring 管理的 mongo 文档之一中正确定义。尝试检查您的 ensureIndex 方法和 @CompoundIndex 注释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      • 2017-10-04
      • 2019-03-15
      • 2014-11-30
      • 1970-01-01
      相关资源
      最近更新 更多