无法在Spring AWS示例中强制转换为org.springframework.core.io.WritableResource

时间:2017-11-06 10:54:26

标签: spring amazon-web-services amazon-s3

我正在阅读此文档:

http://cloud.spring.io/spring-cloud-aws/spring-cloud-aws.html

从Spring应用程序使用AWS。我对S3特别感兴趣,因此,我设置了应用程序并复制了这段代码以确保设置正常工作:

Resource resource = this.resourceLoader.getResource("s3://myBucket/rootFile.log");
WritableResource writableResource = (WritableResource) resource;
try (OutputStream outputStream = writableResource.getOutputStream()) {
  outputStream.write("test".getBytes());
}

但是当我运行它时,我收到了这个错误:

java.lang.ClassCastException: org.springframework.web.context.support.ServletContextResource cannot be cast to org.springframework.core.io.WritableResource

任何想法有什么不对?这是一个设置问题?它看起来不像我,但我是新手。

3 个答案:

答案 0 :(得分:0)

尝试将Resource类声明/转换为FileSystemResource:

FileSystemResource resource = this.resourceLoader.getResource("s3://myBucket/rootFile.log");
WritableResource writableResource = (WritableResource) resource;
try (OutputStream outputStream = writableResource.getOutputStream()) {
  outputStream.write("test".getBytes());
}

答案 1 :(得分:0)

我有同样的问题,结果我使用了错误的lib。尝试从

更改依赖关系
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-aws</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-aws</artifactId>
    </dependency>

另外不要忘记在application.yml中添加aws配置,否则它不会启动。

cloud.aws:
    region.static: your-region
    credentials:
      accessKey: your-key
      secretKey: your-secret

希望这可以解决您的问题。

答案 2 :(得分:0)

我尝试遵循@accresse提出的解决方案,但没有成功。解决该问题的唯一方法是声明一个新的 SimpleStorageProtocolResolver 并将其作为 ProtocolResolver 添加到 DefaultResourceLoader < / strong>。使用Spring Boot 2.1.7 e和Spring Cloud Aws 2.1.4。

@Autowired
public void configureResourceLoader(AmazonS3 amazonS3, DefaultResourceLoader resourceLoader) {
    SimpleStorageProtocolResolver simpleStorageProtocolResolver = new SimpleStorageProtocolResolver(amazonS3);
    // As we are calling it by hand, we must initialize it properly.
    simpleStorageProtocolResolver.afterPropertiesSet();
    resourceLoader.addProtocolResolver(simpleStorageProtocolResolver);
}

要链接的链接: