在运行Amazons3的ListObject(..)方法时,我有一些戏剧性。我敢肯定,由于我能够使用s3client.getObject(..)下载单个文件,因此我的凭据已正确设置。日志读取::
com.amazonaws.SdkClientException: Failed to parse XML document with handler class
com.amazonaws.services.s3.model.transform.XmlResponsesSaxParser$ListObjectsV2Handler
Caused by: org.xml.sax.SAXParseException: Premature end of file.
我知道ListObjects(..)确实包含了一些包含元数据的XML。重现错误的代码非常简单。我在这里看不到任何错误:(
ListObjectSrequest listObjectSrequest = new ListObjectSrequest() .withbucketname(env.getProperty(" cloud.aws.s3.bucket"));
对象列表对象列表= Amazons3Client.listObjects(ListObjectSrequest);
这是我正在使用的Spring-Cloud-aws-context的版本:: <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-aws-context</artifactId
<version>1.2.1.RELEASE</version>
</dependency>
有人有洞察力吗?还是知道这个问题?
预先感谢:)
我遇到了确切的异常 *未能使用Handler class *解析XML文档,并且失败并不是真正的描述性。但是我的问题不是权限,而是试图直接列出水桶子文件夹。
i试图从/bucketName/subfolder/subfolder2而不是仅/bucketName和前缀来列表。
这将导致上面的例外(在Scala中):
val path = "/bucketName/myFolder/subFolder"
val results = s3Client.listObjectsV2(path)
我需要将存储桶名和前缀分开,然后使用ListObjectRequestv2
val path = "/bucketName/myFolder/subFolder"
val bucketName = "bucketName"
val prefix = "myFolder/subFolder"
val listObjectsRequest = new
val ListObjectsV2Request().withBucketName(bucketName).withPrefix(prefix)
val results = s3Client.listObjectsV2(path)
好吧,我找到了解决方案!问题在于权限,显然ListObjects(..)需要自己的一组权限。特别是必须启用" ListBucket"操作。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::test"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::test/*"]
}
]
}
另一个问题是我给水桶的名称是如何的。我使用了mybucket/some/prefix/before/files
。我将其更正为mybucket
。前缀仅与getObject(..)一起使用:
GetObjectRequest getObjectRequest = new
GetObjectRequest("mybucket/some/prefix/before/files", key);
S3Object s3Object = amazonS3Client.getObject(getObjectRequest);