尝试listObjects时,AmazonS3客户端org.xml.sax.SAXParseException

时间:2017-09-08 13:12:41

标签: java xml amazon-web-services spring-boot amazon-s3

我在运行AmazonS3的listObjects(..)方法时遇到了一些戏剧性问题。我确定我的凭据设置正确,因为我可以使用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&#34));

ObjectListing objectListing =   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>

有人有任何见解吗?或者知道这个问题?

提前致谢:)

2 个答案:

答案 0 :(得分:1)

好的,我找到了解决方案!问题在于权限,显然listObjects(..)需要它自己的权限集。特别是&#39; ListBucket&#39;必须启用操作。

{ "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&#39;。我把它更正为了#mybucket&#39;。前缀仅与getObject(..)一起使用,如下所示:

GetObjectRequest getObjectRequest = new GetObjectRequest("mybucket/some/prefix/before/files", key); S3Object s3Object = amazonS3Client.getObject(getObjectRequest);

答案 1 :(得分:1)

我遇到了确切的异常 *无法通过处理程序类解析XML文档 *,并且该失败并不是真正的描述性事件。 但是我的问题不是权限,而是试图直接列出存储桶子文件夹。

我试图从/ 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)