我知道spring-cloud-aws提供SimpleStorageResourceLoader
来允许从S3加载资源,并使用s3://<bucket>/<key>
等路径模式。我遇到的问题是如何确保在解析mvc组件中的静态资源时ResourceLoader
被使用。以下是我对资源映射的配置:
@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)
的电话。不幸的是,最终只是DefaultResourceLocator
,当Resource
返回时,它最终成为路径为ServletContextResource
的{{1}}。
我已经在我的application.yml文件中配置了我的aws凭据:
/s3://<bucket>/
我没有做任何特殊的自动装配或启动任何特定于AWS的bean,因为我的理解是spring-cloud-starter-aws会在Spring Boot的上下文中为我做这件事。
我能够在同一个项目中创建cloud:
aws:
credentials:
accessKey: <myaccess>
secretKey: <mysecret>
region:
static: us-east-1
来测试我的AWS连接是否正确。这是测试:
ApplicationRunner
此测试能够在应用程序启动时输出@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);
}
}
文件的内容。
为了让资源处理程序能够运行,我缺少什么?