Amazons3客户端org.xml.sax.saxparseexception尝试列表对象



在运行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);

最新更新