Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试列出对象时,AmazonS3客户端org.xml.sax.SAXParseException_Java_Xml_Amazon Web Services_Spring Boot_Amazon S3 - Fatal编程技术网

Java 尝试列出对象时,AmazonS3客户端org.xml.sax.SAXParseException

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

在运行AmazonS3的listObjects(…)方法时,我有些激动人心。我确信我的凭证设置正确,因为我可以使用s3Client.getObject(..)下载单个文件。日志如下:

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)