为了账号安全,请及时绑定邮箱和手机立即绑定

在 Spring 上重复 AWS S3 Bean,但找不到重复项

在 Spring 上重复 AWS S3 Bean,但找不到重复项

至尊宝的传说 2022-06-08 17:45:04
我们刚刚在一个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;@Configurationpublic 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;@Servicepublic class MyService {    private final AmazonS3Client s3Client;    @Autowired    public MyService(AmazonS3Client s3Client) {        this.s3Client = s3Client;    }    ...}它应该使用AmazonS3Client我们刚刚创建的,并且根据错误消息的第一个匹配它匹配它就好了。如果我删除我的S3Config类,bean 复制错误就消失了。我们不想AmazonS3Client通过添加@Primary注解来强制项目使用我们的实现。那么,我们可能做错了什么?
查看完整描述

1 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

经过几个小时的调试,我们意识到 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 重复错误消失了。我们所要做的就是像 bean 一样命名构造函数的参数。


查看完整回答
反对 回复 2022-06-08
  • 1 回答
  • 0 关注
  • 168 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信