2016-05-12 11 views
1

以下のコードは、S3のフォルダ内から1つのファイルをダウンロードしようとしています。以下のメッセージハンドラを使用しています。Aws統合スプリング:フォルダ内のファイルをダウンロードできません。

注:以下のコードは、S3バケットのルートディレクトリ内に配置されたファイルに対して機能します。フォルダに置かれたファイルに対しては機能しません。ペイロードを使用して

@Bean 
    @ServiceActivator(inputChannel = "s3Channel") 
    public MessageHandler s3Handler() { 
     ExpressionParser PARSER = new SpelExpressionParser(); 
     S3MessageHandler s3MessageHandler = new S3MessageHandler(amazonS3(), "test.queue", true); 
     s3MessageHandler.setOutputChannel(this.channel); 
     s3MessageHandler.setCommand(S3MessageHandler.Command.DOWNLOAD); 
     s3MessageHandler.setKeyExpression(PARSER.parseExpression("payload instanceof T(java.io.File) ? payload.name : headers.key")); 
     s3MessageHandler.setObjectAclExpression(new ValueExpression<>(CannedAccessControlList.PublicReadWrite)); 
     return s3MessageHandler; 
} 

Message<?> payload = MessageBuilder.withPayload(new File("test/s3testfile.xml")).build(); 

this.s3ProcessChannel.send(payload); 

次のスタックトレースは、フォルダでのファイルのダウンロードを発生します。

org.springframework.messaging.MessageHandlingException: error occurred in message handler [s3MessageHandler]; nested exception is com.amazonaws.services.s3.model.AmazonS3Exception: Not Found (Service: Amazon S3; Status Code: 404; Error Code: 404 Not Found;) 
     at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:139) ~[spring-integration-core-4.2.5.RELEASE.jar:na] 
     at org.springframework.messaging.support.ExecutorSubscribableChannel$SendTask.run(ExecutorSubscribableChannel.java:135) ~[spring-messaging-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.messaging.support.ExecutorSubscribableChannel.sendInternal(ExecutorSubscribableChannel.java:91) ~[spring-messaging-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.messaging.support.AbstractMessageChannel.send(AbstractMessageChannel.java:117) ~[spring-messaging-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.messaging.support.AbstractMessageChannel.send(AbstractMessageChannel.java:104) ~[spring-messaging-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at com.rapid7.live.assessment.aws.inbound.channels.SqsAssessmentMessageChannel.send(SqsAssessmentMessageChannel.java:44) ~[classes/:na] 
     at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115) ~[spring-messaging-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:45) ~[spring-messaging-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:105) ~[spring-messaging-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.integration.endpoint.MessageProducerSupport.sendMessage(MessageProducerSupport.java:105) ~[spring-integration-core-4.2.5.RELEASE.jar:na] 
     at org.springframework.integration.aws.inbound.SqsMessageDrivenChannelAdapter.access$400(SqsMessageDrivenChannelAdapter.java:53) ~[spring-integration-aws-1.0.0.M1.jar:na] 
     at org.springframework.integration.aws.inbound.SqsMessageDrivenChannelAdapter$IntegrationQueueMessageHandler.handleMessageInternal(SqsMessageDrivenChannelAdapter.java:154) ~[spring-integration-aws-1.0.0.M1.jar:na] 
     at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessage(AbstractMethodMessageHandler.java:389) ~[spring-messaging-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer.executeMessage(SimpleMessageListenerContainer.java:181) ~[spring-cloud-aws-messaging-1.1.0.RC1.jar:1.1.0.RC1] 
     at org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer$MessageExecutor.run(SimpleMessageListenerContainer.java:314) ~[spring-cloud-aws-messaging-1.1.0.RC1.jar:1.1.0.RC1] 
     at org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer$SignalExecutingRunnable.run(SimpleMessageListenerContainer.java:368) [spring-cloud-aws-messaging-1.1.0.RC1.jar:1.1.0.RC1] 
     at org.springframework.core.task.SimpleAsyncTaskExecutor$ConcurrencyThrottlingRunnable.run(SimpleAsyncTaskExecutor.java:251) [spring-core-4.2.5.RELEASE.jar:4.2.5.RELEASE] 

ファイルは正しいバケットに存在します。

答えて

1

まあ、File.getName()のファイル名のみを返します。親ディレクトリはありません。

は変更を検討し、あなたのkeyExpressionへ:

"payload instanceof T(java.io.File) ? payload.path : headers.key" 

それとも、ファイルのペイロードに返信が、常にヘッダー内の適切なkeyを指定しないでください。

関連する問題