2

我知道 spring-cloud-aws 提供了一个SimpleStorageResourceLoader允许从 S3 加载资源的路径模式,例如s3://<bucket>/<key>. 我遇到的问题是如何确保ResourceLoader在解析 mvc 组件中的静态资源时使用它。这是我对资源映射的配置:

@Configuration
public class TestWebConfigurer extends WebMvcConfigurerAdapter {
    private String s3Location;

    // ${test.s3.location} comes in as "s3://<bucket>/"   
    public TestWebConfigurer(@Value("${test.s3.location}") String s3Location) {
        this.s3Location = s3Location;
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/mytest/**").addResourceLocations(s3Location);
    }
}

当我单步执行其中的代码时,addResourceLocations()那里会调用resourceLoader.getResource(location). 不幸的是,这最终只是 the DefaultResourceLocator,当Resource返回时它最终成为一个ServletContextResourcewith 路径/s3://<bucket>/

我已经在我的 application.yml 文件中配置了我的 aws 凭据,如下所示:

cloud:
  aws:
    credentials:
      accessKey: <myaccess>
      secretKey: <mysecret>
    region:
      static: us-east-1

我没有做任何特别的事情来自动装配或启动任何 AWS 特定的 bean,因为我的理解是 spring-cloud-starter-aws 会在 Spring Boot 的上下文中为我做这件事。

我能够ApplicationRunner在同一个项目中创建一个来测试我的 AWS 连接是否正确。这是测试:

@Component
public class TestSimpleStorageLoader implements ApplicationRunner {
    private ResourceLoader loader;

    public TestSimpleStorageLoader(ResourceLoader loader) {
        this.loader = loader;
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        Resource resource = this.loader.getResource("s3://<bucket>/test.txt");

        IOUtils.copy(resource.getInputStream(), System.out);
    }
}

该测试能够test.txt在应用程序启动时输出文件的内容。

我缺少什么让这个为资源处理程序工作?

4

0 回答 0