Cannot resolve reference to bean 'mongoTemplate' while setting bean property 'mongoOperations' while deploying AWS Lambda

huangapple go评论111阅读模式
英文:

Cannot resolve reference to bean 'mongoTemplate' while setting bean property 'mongoOperations' while deploying AWS Lambda

问题

以下是翻译好的内容:

错误:-

{
  "errorMessage": "在文件[/var/task/org/qmetech/service/AssociationService.class]中定义的名为'associationService'的bean创建错误: 通过构造函数参数0表达的不满足的依赖项; 嵌套异常是org.springframework.beans.factory.BeanCreationException: 在设置bean属性'mongoOperations'时无法解析对bean'mongoTemplate'的引用; 嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException: 不存在名为'mongoTemplate'的bean",
  "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 {
    compile libraries.commonlibraries
    implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
}

UserRepository.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

有谁可以告诉我我做错了什么吗?

谢谢!

英文:

I have a spring cloud function project for running the code in AWS Lambda.
The spring boot application runs fine locally. But gives the below error when deployed in AWS Lambda.

Error:-

{
  &quot;errorMessage&quot;: &quot;Error creating bean with name &#39;associationService&#39; 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 &#39;userRepository&#39;: Cannot resolve reference to bean &#39;mongoTemplate&#39; while setting bean property &#39;mongoOperations&#39;; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named &#39;mongoTemplate&#39; available&quot;,
  &quot;errorType&quot;: &quot;org.springframework.beans.factory.UnsatisfiedDependencyException&quot;,
  &quot;stackTrace&quot;: [

The project has a root project which has a subproject 'GetAssociationService'

rootproject - build.gradle

plugins {
    id &#39;org.springframework.boot&#39; version &#39;2.2.5.RELEASE&#39;
    id &#39;io.spring.dependency-management&#39; version &#39;1.0.9.RELEASE&#39;
    id &#39;java&#39;
    id &#39;com.github.johnrengelman.shadow&#39; version &#39;5.2.0&#39;
}

bootJar { enabled = false }

jar { enabled = true }

subprojects {
    group = &#39;org.qmetech&#39;
    version = &#39;1.0.0&#39;
    sourceCompatibility = &#39;1.8&#39;
    targetCompatibility = &#39;1.8&#39;
    apply plugin: &#39;org.springframework.boot&#39;
    apply plugin: &#39;io.spring.dependency-management&#39;
    apply plugin: &#39;com.github.johnrengelman.shadow&#39;
    apply plugin: &#39;java&#39;
}

repositories { mavenCentral ( ) }

ext { set ( &#39;springCloudVersion&#39; , &quot;Hoxton.SR3&quot; ) }

dependencies {
    testImplementation ( &#39;org.springframework.boot:spring-boot-starter-test&#39; ) {
        exclude group: &#39;org.junit.vintage&#39; , module: &#39;junit-vintage-engine&#39;
    }
}

ext.libraries = [
        commonlibraries: [&#39;org.springframework.boot:spring-boot-starter:2.2.5.RELEASE&#39; ,
                          &#39;org.springframework.cloud:spring-cloud-function-context&#39; ,
                          &#39;org.springframework.cloud:spring-cloud-function-adapter-aws:2.0.1.RELEASE&#39; ,
                          &#39;com.amazonaws:aws-lambda-java-log4j:1.0.0&#39; ,
                          &#39;org.springframework.boot:spring-boot-starter-web:2.2.5.RELEASE&#39; ,
                          &#39;org.springframework.cloud:spring-cloud-starter-function-web:1.0.0.RELEASE&#39; ,
                          &#39;org.springframework.boot.experimental:spring-boot-thin-layout:1.0.11.RELEASE&#39; ,
                          &#39;org.springframework.cloud:spring-cloud-starter-function-web:1.0.0.RELEASE&#39; ,
                          &#39;org.springframework.data:spring-data-mongodb:2.2.5.RELEASE&#39;
        ] ,
]

dependencyManagement {
    imports {
        mavenBom &quot;org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}&quot;
    }
}

test { useJUnitPlatform ( ) }

ChildProject - build.gradle

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
}

springBoot {
    mainClassName = &#39;org.qmetech.GetAssociationService&#39;
}

dependencies {
    dependencies {
        compile libraries.commonlibraries
        implementation &#39;org.springframework.boot:spring-boot-starter-data-mongodb&#39;
    }
}

UserRepository.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&lt;User, Integer&gt; { }

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&lt;String, List&lt;User&gt;&gt; {

    private final UserRepository userRepository;

    public AssociationService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public List&lt;User&gt; apply(String uppercaseRequest) {
        List&lt;User&gt; users = userRepository.findAll();
        return users;
    }
}

The Complete Code can be found here - https://github.com/iftekharkhan09/Services

Can Anyone please tell me what am I doing wrong?

Thanks!

答案1

得分: 1

你需要创建 [`MongoTemplate`][1] 的 bean因为默认配置中没有要注入的实例

@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`,它在 Spring Boot 2.2 中替代了已弃用的 `com.mongodb.MongoClient`。

  [1]: https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/core/MongoTemplate.html
英文:

You need to create beans of MongoTemplate since there are none to be injected by default configuration.

@Bean
public MongoClient mongoClient() {
    return new MongoClient(&quot;localhost&quot;, 27017);
}

@Bean
public MongoTemplate mongoTemplate(MongoClient mongoClient) throws Exception {
    return new MongoTemplate(mongoClient, &quot;databaseName&quot;);
}

Also, don't forget to use com.mongodb.client.MongoClient which replaces reprecated com.mongodb.MongoClient as of Spring Boot 2.2.

huangapple
  • 本文由 发表于 2020年3月15日 20:25:22
  • 转载请务必保留本文链接:https://go.coder-hub.com/60692848.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定