Мы только что создали пользовательский 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
.
Итак, что мы можем делать неправильно?