我知道 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
返回时它最终成为一个ServletContextResource
with 路径/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
在应用程序启动时输出文件的内容。
我缺少什么让这个为资源处理程序工作?