在 s3-outbound-gateway 中使用 object-acl-expression

Use of object-acl-expression in s3-outbound-gateway

我想在 s3-outbound-gateway 中使用 object-acl-expression,如下所述配置 但是,由于 else section.I 中的空值,它抛出 "Illegal state Exception" 不想在 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>

预期:object-acl-expression 应该在存储桶中默认提供 实际:投掷 "Illegal state exception"

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 生活?