在Spring上有重复的AWS S3 Bean,但是找不到重复的位置

时间:2019-02-08 01:27:37

标签: java spring spring-boot amazon-s3

我们刚刚在一个已经使用Amazon S3功能的项目上使用凭证创建了自定义AmazonS3Client

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类,那么bean复制错误就消失了。

我们不想通过添加AmazonS3Client注释来强制项目使用我们的@Primary实现。

那么,我们可能做错了什么?

1 个答案:

答案 0 :(得分:0)

经过几个小时的调试,我们意识到Service的构造函数的参数名称未正确命名为Bean。我们对其进行了重命名,使其与Bean的名称匹配:

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

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

    ...
}

并且Bean复制错误消失了。我们要做的就是像豆一样命名构造函数的参数