我要在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应该是存储桶中提供的默认值 当前:抛出“非法状态异常”
答案 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
了?