Исключение BeanCreationException в микросервисном приложении с интеграцией AWS Dynamodb

#java #spring #spring-boot #spring-data-jpa #amazon-dynamodb

#java #весна #весенняя загрузка #spring-data-jpa #amazon-dynamodb

Вопрос:

Я работаю над микросервисным приложением, используя Spring Boot 2.1.1 и Java 8. В данном случае используется база данных AWS DynamoDB. Я получаю следующую ошибку при запуске моего приложения:-

 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userProfileJpaRepository': Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities)
  

Полный журнал ошибок:-

Ошибка при запуске ApplicationContext. Чтобы отобразить отчет об условиях, повторно запустите свое приложение с включенной функцией ‘debug’. 2019-03-15 15:01:01.148 ОШИБКА 20204 — [основная] операционная системазагружается.SpringApplication: сбой запуска приложения

org.springframework.beans.factory.Исключение UnsatisfiedDependencyException: ошибка при создании компонента с именем ‘methodValidationPostProcessor’, определенным в пути к классу resource [org/springframework/boot/autoconfigure/validation/ValidationAutoConfiguration.class ]: Неудовлетворенная зависимость, выраженная с помощью параметра метода ‘methodValidationPostProcessor’ 0; вложенным исключением является org.springframework.beans.factory.Исключение BeanCreationException: ошибка при создании компонента с именем ‘userProfileJpaRepository’: не удалось разрешить соответствующий конструктор (подсказка: укажите аргументы index / type / name для простых параметров, чтобы избежать неоднозначности типов) в org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:769) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:509) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1288) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в организации.springframework.beans.factory.support.Абстрактно автоматически настраиваемый BeanFactory.createBeanInstance (абстрактно автоматически настраиваемый BeanFactory.java:1127) ~ [spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.beans.factory.support.Абстрактно автоматически настраиваемый BeanFactory.doCreateBean(абстрактно автоматически настраиваемый BeanFactory.java:538) ~ [spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.beans.factory.support.Абстрактно автоматически настраиваемый BeanFactory.createBean(абстрактно автоматически настраиваемый BeanFactory.java:498) ~ [spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean $0 (AbstractBeanFactory.java: 320) ~ [spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.beans.factory.support.По умолчанию используется файловая система beanregistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.beans.factory.support.Абстрактный BeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в организации.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:228) ~[spring-context-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.context.support.Абстрактное приложение context.registerBeanPostProcessors (абстрактное приложение context.java:707) ~[spring-context-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.context.support.Абстрактное приложение context.refresh(AbstractApplicationContext.java:531) ~[spring-context-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) ~[spring-boot-2.1.1.RELEASE.jar:2.1.1.RELEASE] в org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) [spring-boot-2.1.1.RELEASE.jar:2.1.1.RELEASE] в org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) [spring-boot-2.1.1.RELEASE.jar:2.1.1.RELEASE] в организации.springframework.boot.SpringApplication.run(SpringApplication.java:316) [spring-boot-2.1.1.RELEASE.jar:2.1.1.RELEASE] в org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) [spring-boot-2.1.1.RELEASE.jar:2.1.1.RELEASE] в org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) [spring-boot-2.1.1.RELEASE.jar:2.1.1.RELEASE] в com.user.profile.Пользовательское приложение.main(UserProfileApplication.java:14) [classes/:na], вызванное: org.springframework.beans.factory.Исключение BeanCreationException: ошибка при создании компонента с именем ‘userProfileJpaRepository’: не удалось разрешить соответствующий конструктор (подсказка: укажите аргументы index / type / name для простых параметров, чтобы избежать неоднозначности типов) в org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:268) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.beans.factory.support.Абстрактно автоматически настраиваемый BeanFactory.autowireConstructor (абстрактно автоматически настраиваемый BeanFactory.java:1308) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в организации.springframework.beans.factory.support.Абстрактно автоматически настраиваемый BeanFactory.createBeanInstance (абстрактно автоматически настраиваемый BeanFactory.java:1154) ~ [spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getSingletonFactoryBeanForTypeCheck(AbstractAutowireCapableBeanFactory.java:974) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.beans.factory.support.Абстрактно автоматически настраиваемый BeanFactory.getTypeForFactoryBean(абстрактно автоматически настраиваемый BeanFactory.java:848) ~ [spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch (AbstractBeanFactory.java:574) ~ [spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType (DefaultListableBeanFactory.java:514) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:477) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в организации.springframework.beans.factory.BeanFactoryUtils.beanNamesForTypeIncludingAncestors(BeanFactoryUtils.java:227) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1401) ~ [spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.beans.factory.support.DefaultListableBeanFactory.Устранение зависимости (DefaultListableBeanFactory.java: 1200) ~ [spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.beans.factory.support.DefaultListableBeanFactory.Разрешенная зависимость (DefaultListableBeanFactory.java: 1164) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:857) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] в org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:760) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE] … пропущено 19 общих фреймов

Process finished with exit code 1

Main class file:-

     package com.user.profile;

import org.socialsignin.spring.data.dynamodb.repository.config.EnableDynamoDBRepositories;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan("com.user.profile.jpa") //to scan packages mentioned
@EnableDynamoDBRepositories(basePackages = "com.user.profile.jpa")
public class UserProfileApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserProfileApplication.class, args);
    }

}
  

POM.xml:-

     <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.user.profile</groupId>
    <artifactId>user-profile</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>user-profile</name>
    <description>User Profile</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

<!--        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>-->

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
            <scope>provided</scope>
        </dependency>

        <!-- Amazon DynamoDB -->
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-dynamodb</artifactId>
            <version>1.11.470</version>
        </dependency>
        <!-- Community module for DynamoDB -->
        <dependency>
            <groupId>com.github.derjust</groupId>
            <artifactId>spring-data-dynamodb</artifactId>
            <version>4.3.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
        <finalName>docker-spring-boot</finalName>
    </build>

    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </pluginRepository>
        <pluginRepository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </pluginRepository>
    </pluginRepositories>

</project>
  

application.properties file:-

 amazon.dynamodb.endpoint=http://localhost:8000/
amazon.aws.accesskey=HSGHAD768242
amazon.aws.secretkey=ghjgh677238hjhjhHJJHADU8977JKHKJ
amazon.dynamodb.region="us-west-2"

spring.main.allow-bean-definition-overriding=true
#spring.profiles.active=dev

server.port=8090
  

JPA repository:-

    package com.user.profile.jpa;

import com.user.profile.model.UserProfileModel;
import org.socialsignin.spring.data.dynamodb.repository.EnableScan;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@EnableScan
public interface UserProfileJpaRepository extends CrudRepository<UserProfileModel, Integer> {


}
  

DynamoDB configuration class:-

    package com.user.profile.jpa;

import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;
import org.socialsignin.spring.data.dynamodb.repository.config.EnableDynamoDBRepositories;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration
@EnableDynamoDBRepositories(basePackages = "com.user.profile.jpa")
public class DynamoDbConfig {

    @Value("${amazon.dynamodb.endpoint}")
    private String dynamoDbEndPoint;

    @Value("${amazon.aws.accesskey}")
    private String accessKey;

    @Value("${amazon.aws.secretkey}")
    private String secretAccessKey;

    @Value("${amazon.dynamodb.region}")
    private String dynamoDBRegion;

    @Bean
    public DynamoDBMapperConfig dynamoDBMapperConfig() {
        return DynamoDBMapperConfig.DEFAULT;
    }

    @Bean
    public DynamoDBMapper dynamoDBMapper(AmazonDynamoDB amazonDynamoDB, DynamoDBMapperConfig config) {
        return new DynamoDBMapper(amazonDynamoDB, config);
    }

    @Bean
    public AmazonDynamoDB amazonDynamoDB() {
        return AmazonDynamoDBClientBuilder
                .standard()
                .withEndpointConfiguration(
                        new AwsClientBuilder.EndpointConfiguration(dynamoDbEndPoint, dynamoDBRegion))
                .build();
    }

    @Bean
    public DynamoDB dynamoDB() {
        return new DynamoDB(amazonDynamoDB());
    }

}
  

Класс сущности:-

     package com.user.profile.model;

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAutoGeneratedKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;

import java.util.UUID;

@DynamoDBTable(tableName = "UserProfileModel")
public class UserProfileModel {
    private UUID uuid;
    private Integer userId;
    private String firstName;
    private String lastName;
    private String gender;
    private int age;


/*    public UserProfileModel() {

    }

    public UserProfileModel(UUID uuid, int userId, String firstName, String lastName, String gender, int age) {
        this.uuid = uuid;
        this.userId = userId;
        this.firstName = firstName;
        this.lastName = lastName;
        this.gender = gender;
        this.age = age;
    }*/


    public UUID getUuid() {
        return uuid;
    }

    public void setUuid(UUID uuid) {
        this.uuid = uuid;
    }

    @DynamoDBHashKey
    @DynamoDBAutoGeneratedKey
    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    @DynamoDBAttribute
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @DynamoDBAttribute
    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @DynamoDBAttribute
    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @DynamoDBAttribute
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "UserProfileModel{"  
                "uuid="   uuid  
                ", userId="   userId  
                '}';
    }
}
  

Я считаю, что что-то не так с объявлением моего репозитория JPA.
Я был бы очень признателен, если бы вы могли указать основную причину этого.

Приветствия

Комментарии:

1. Пожалуйста, дайте мне знать основную причину этой проблемы. Спасибо

2. Пожалуйста, поделитесь своим файлом конфигурации spring, в котором вы определили компонент «methodValidationPostProcessor».

3. У меня нет файла конфигурации Spring. это проект spring boot.

4. Какие версии spring-data-commons и spring-data-jpa вы используете?