Использование object-acl-выражения в s3-outbound-gateway - PullRequest
0 голосов
/ 14 января 2019

Я хочу использовать выражение object-acl в s3-outbound-gateway, как указано ниже в конфигурации но это выдает «Исключение из-за недопустимого состояния» из-за нулевого значения в разделе 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>

ожидается: объект-acl-выражение должно быть по умолчанию предоставлено в корзине Актуально: Бросок "Незаконное государственное исключение"

1 Ответ

0 голосов
/ 14 января 2019

Это невозможно с текущей реализацией 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?

...