在 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
生活?
我想在 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
生活?