Java 尝试列出对象时,AmazonS3客户端org.xml.sax.SAXParseException
在运行AmazonS3的listObjects(…)方法时,我有些激动人心。我确信我的凭证设置正确,因为我可以使用s3Client.getObject(..)下载单个文件。日志如下:Java 尝试列出对象时,AmazonS3客户端org.xml.sax.SAXParseException,java,xml,amazon-web-services,spring-boot,amazon-s3,Java,Xml,Amazon Web Services,Spring Boot,Amazon S3,在运行AmazonS3的listObjects(…)方法时,我有些激动人心。我确信我的凭证设置正确,因为我可以使用s3Client.getObject(..)下载单个文件。日志如下: com.amazonaws.SdkClientException:无法使用处理程序类解析XML文档 com.amazonaws.services.s3.model.transform.XMLResponsesXParser$ListObjectsV2Handler 原因:org.xml.sax.SAXParseEx
com.amazonaws.SdkClientException:无法使用处理程序类解析XML文档
com.amazonaws.services.s3.model.transform.XMLResponsesXParser$ListObjectsV2Handler
原因:org.xml.sax.SAXParseException:文件过早结束。
我知道listObjects(..)的响应中确实包含一些包含元数据的xml。重现错误的代码非常简单。我看不出这里有什么不对劲:(
ListObjectsRequest ListObjectsRequest=新建ListObjectsRequest()
.withBucketName(ENV.getProperty(“cloud.aws.s3.bucket”)
ObjectListing ObjectListing=
amazonS3Client.listObjects(listObjectsRequest)
以下是我正在使用的SpringCloudAWS上下文的版本:
org.springframework.cloud
spring cloud aws context好的,我找到了解决方案!问题在于权限,显然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/*"]
}
]
}
另一个问题是我如何给我的bucket命名。我使用了mybucket/some/prefix/before/files
。我将其更正为mybucket
。前缀仅与getObject(..)一起使用,如下所示:
GetObjectRequest getObjectRequest = new
GetObjectRequest("mybucket/some/prefix/before/files", key);
S3Object s3Object = amazonS3Client.getObject(getObjectRequest);
我遇到了一个确切的异常,*无法使用处理程序类解析XML文档,并且该故障不是真正的描述性故障。
但我的问题不是权限,而是试图直接列出bucket子文件夹
我试图从/bucketName/subFolder/subFolder2列出对象,而不仅仅是/bucketName和prefix
这导致上述异常(在Scala中):
我需要分离bucket名称和前缀,然后使用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)
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)