Дубликат AWS S3 Bean на Spring, но дубликата нигде нет - PullRequest
0 голосов
/ 08 февраля 2019

Мы только что создали пользовательский AmazonS3Client с учетными данными для проекта, который уже использовал функциональность Amazon S3:

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

@Configuration
public class S3Config {

    @Bean
    public static AmazonS3Client amazonS3Client(final AWSCredentialsProvider awsCredentialsProvider) {
        return (AmazonS3Client) AmazonS3ClientBuilder.standard()
                .withCredentials(awsCredentialsProvider)
                .build();
    }
}

Он отлично работал во всех других проектах, но по какой-то причине при запускедо приложения мы получаем эту ошибку:

Parameter 0 of constructor in foo.bar.MyService required a single bean, but 2 were found:
    - amazonS3Client: defined by method 'amazonS3Client' in class path resource [foo/bar/S3Config.class]
    - amazonS3: defined in null

Нигде, абсолютно нигде в проекте мы не определили amazonS3 Bean.

Итак, что является содержимым этого класса Service?Ну, ничего особенного:

import com.amazonaws.services.s3.AmazonS3Client;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.ByteArrayInputStream;
import java.net.URL;

@Service
public class MyService {
    private final AmazonS3Client s3Client;

    @Autowired
    public MyService(AmazonS3Client s3Client) {
        this.s3Client = s3Client;
    }

    ...
}

Предполагается использовать AmazonS3Client, который мы только что создали, и в соответствии с первым совпадением в сообщении об ошибке он соответствует ему просто отлично.Если я удаляю свой класс S3Config, ошибка дублирования бина исчезнет.

Мы не хотим заставлять проект использовать нашу реализацию AmazonS3Client, добавляя аннотацию @Primary.

Итак, что мы можем делать неправильно?

1 Ответ

0 голосов
/ 08 февраля 2019

После нескольких часов отладки мы поняли, что имя параметра конструктора Сервиса не было точно названо как Бин.Мы переименовали его так, чтобы оно соответствовало имени Бина:

@Service
public class MyService {
    private final AmazonS3Client s3Client; //Just fine

    @Autowired
    public MyService(AmazonS3Client amazonS3Client) { // Must match the bean name
        this.s3Client = amazonS3Client;
    }

    ...
}

И ошибка дублирования Бина исчезла.Все, что нам нужно сделать, это назвать параметр конструктора точно так же, как боб .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...