代码之家  ›  专栏  ›  技术社区  ›  Sunny

在部署AWS Lambda时设置bean属性“mongoOperations”时,无法解析对bean“mongoTemplate”的引用

  •  0
  • Sunny  · 技术社区  · 5 年前

    我有一个spring cloud函数项目,用于在AWS Lambda中运行代码。 spring boot应用程序在本地运行良好。但是在AWS Lambda中部署时会出现以下错误。

    错误:-

    {
      "errorMessage": "Error creating bean with name 'associationService' defined in file [/var/task/org/qmetech/service/AssociationService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Cannot resolve reference to bean 'mongoTemplate' while setting bean property 'mongoOperations'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'mongoTemplate' available",
      "errorType": "org.springframework.beans.factory.UnsatisfiedDependencyException",
      "stackTrace": [
    

    该项目有一个根项目,该根项目有一个子项目“GetAssociationService”

    根项目-build.gradle

    plugins {
        id 'org.springframework.boot' version '2.2.5.RELEASE'
        id 'io.spring.dependency-management' version '1.0.9.RELEASE'
        id 'java'
        id 'com.github.johnrengelman.shadow' version '5.2.0'
    }
    
    bootJar { enabled = false }
    
    jar { enabled = true }
    
    subprojects {
        group = 'org.qmetech'
        version = '1.0.0'
        sourceCompatibility = '1.8'
        targetCompatibility = '1.8'
        apply plugin: 'org.springframework.boot'
        apply plugin: 'io.spring.dependency-management'
        apply plugin: 'com.github.johnrengelman.shadow'
        apply plugin: 'java'
    }
    
    repositories { mavenCentral ( ) }
    
    ext { set ( 'springCloudVersion' , "Hoxton.SR3" ) }
    
    dependencies {
        testImplementation ( 'org.springframework.boot:spring-boot-starter-test' ) {
            exclude group: 'org.junit.vintage' , module: 'junit-vintage-engine'
        }
    }
    
    ext.libraries = [
            commonlibraries: ['org.springframework.boot:spring-boot-starter:2.2.5.RELEASE' ,
                              'org.springframework.cloud:spring-cloud-function-context' ,
                              'org.springframework.cloud:spring-cloud-function-adapter-aws:2.0.1.RELEASE' ,
                              'com.amazonaws:aws-lambda-java-log4j:1.0.0' ,
                              'org.springframework.boot:spring-boot-starter-web:2.2.5.RELEASE' ,
                              'org.springframework.cloud:spring-cloud-starter-function-web:1.0.0.RELEASE' ,
                              'org.springframework.boot.experimental:spring-boot-thin-layout:1.0.11.RELEASE' ,
                              'org.springframework.cloud:spring-cloud-starter-function-web:1.0.0.RELEASE' ,
                              'org.springframework.data:spring-data-mongodb:2.2.5.RELEASE'
            ] ,
    ]
    
    dependencyManagement {
        imports {
            mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
        }
    }
    
    test { useJUnitPlatform ( ) }
    

    儿童项目-build.gradle

    sourceCompatibility = 1.8
    targetCompatibility = 1.8
    
    repositories {
        mavenCentral()
    }
    
    springBoot {
        mainClassName = 'org.qmetech.GetAssociationService'
    }
    
    dependencies {
        dependencies {
            compile libraries.commonlibraries
            implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
        }
    }
    

    用户仓库.java

    package org.qmetech.repository;
    
    import org.qmetech.domain.User;
    import org.springframework.data.mongodb.repository.MongoRepository;
    import org.springframework.stereotype.Repository;
    
    @Repository
    public interface UserRepository extends MongoRepository<User, Integer> { }
    

    AssociationService.java

    package org.qmetech.service;
    
    import org.qmetech.domain.User;
    import org.qmetech.repository.UserRepository;
    import org.springframework.stereotype.Component;
    
    import java.util.List;
    import java.util.function.Function;
    
    @Component
    public class AssociationService implements Function<String, List<User>> {
    
        private final UserRepository userRepository;
    
        public AssociationService(UserRepository userRepository) {
            this.userRepository = userRepository;
        }
    
        @Override
        public List<User> apply(String uppercaseRequest) {
            List<User> users = userRepository.findAll();
            return users;
        }
    }
    

    完整代码可以在这里找到- https://github.com/iftekharkhan09/Services

    有人能告诉我我做错了什么吗?

    谢谢!

    0 回复  |  直到 5 年前
        1
  •  1
  •   Nikolas Charalambidis    5 年前

    你需要创建bean MongoTemplate 因为默认配置下没有要注入的对象。

    @Bean
    public MongoClient mongoClient() {
        return new MongoClient("localhost", 27017);
    }
    
    @Bean
    public MongoTemplate mongoTemplate(MongoClient mongoClient) throws Exception {
        return new MongoTemplate(mongoClient, "databaseName");
    }
    

    另外,别忘了使用 com.mongodb.client.MongoClient 它取代了代表 com.mongodb.MongoClient 从Spring Boot 2.2开始。