首页 > 解决方案 > 在 s3-outbound-gateway 中使用 object-acl-expression

问题描述

我想在 s3-outbound-gateway 中使用 object-acl-expression ,如下面的配置所述,但是由于 else 部分中的 null 值,它会抛出“非法状态异常”。我不想在 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 应该是存储桶中提供的默认值实际:抛出“非法状态异常”

标签: spring-bootspring-integrationspring-integration-aws

解决方案


这在当前的实现中是不可能的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上下文中访问消息……我认为这也是我们必须解决的问题。

也许你现在可以用 theCannedAccessControlList.AuthenticatedRead而不是null


推荐阅读