在S3-Outbound网关中使用对象ACL表达式

时间:2019-01-14 13:54:44

标签: spring-boot spring-integration spring-integration-aws

我要在s3-outbound-gateway中使用object-acl-expression,如下所述         但是,由于else部分中为空值而抛出“非法状态异常”。我不想在else部分中设置任何其他访问控制。         您能否为此提出一些解决方案?。

<int-aws:s3-outbound-gateway
        id="id" request-channel="requestChannelId"
        reply-channel="replayChannelId"
        transfer-manager="tm"
        bucket-expression="bucketName" 
        object-acl-expression="headers.S3_FULL_ACCESS_OWNER_ENABLED == 'Y' ? T(com.amazonaws.services.s3.model.CannedAccessControlList).BucketOwnerFullControl : null
        key-expression="headers.file_name" 
        command="UPLOAD">
    </int-aws:s3-outbound-gateway>

expected:对象-acl-expression应该是存储桶中提供的默认值  当前:抛出“非法状态异常”

1 个答案:

答案 0 :(得分:0)

使用object-acl-expression的当前实现是不可能的。只是因为它不支持null的评估结果:

Object acl = this.objectAclExpression.getValue(this.evaluationContext, requestMessage);
Assert.state(acl instanceof AccessControlList || acl instanceof CannedAccessControlList,
                    "The 'objectAclExpression' ["
                            + this.objectAclExpression.getExpressionString()
                            + "] must evaluate to com.amazonaws.services.s3.model.AccessControlList " +
                            "or must evaluate to com.amazonaws.services.s3.model.CannedAccessControlList. " +
                            "Gotten: [" + acl + "]");

我们当然可以解决此问题,您可以随时提出此问题:https://github.com/spring-projects/spring-integration-aws/issues

与此同时,作为变通办法,我看到了基于S3ProgressListener的解决方案,类似于我们内部进行的操作:

progressListener = new S3ProgressListener() {

                @Override
                public void onPersistableTransfer(PersistableTransfer persistableTransfer) {

                }

                @Override
                public void progressChanged(ProgressEvent progressEvent) {
                    if (ProgressEventType.TRANSFER_COMPLETED_EVENT.equals(progressEvent.getEventType())) {
                        S3MessageHandler.this.transferManager.getAmazonS3Client().setObjectAcl(theAclRequest);
                    }
                }

            };

只有这里的问题是您无法在progressChanged上下文中访问消息...我认为这也是我们必须解决的问题。

也许您现在可以只使用CannedAccessControlList.AuthenticatedRead而不是null了?