标记 S3 存储桶时出现 MalformedXML

MalformedXML when tagging an S3 bucket

我正在尝试使用 AWS Java API 将一组新标签添加到 S3 存储桶,但出现如下错误:

com.amazonaws.services.s3.model.AmazonS3Exception: The XML you provided was not well-formed or did not validate against our published schema (Service: Amazon S3; Status Code: 400; Error Code: MalformedXML; Request ID: 5B3401CBDB133A88), S3 Extended Request ID: z1EDhMH5vN7o/9Tk93K5R1gWmmqUr49WjEz2rovD9HRCGJ54yHBfoTuUURvnpoizlCUK3Fy9qbY=

这是我写的代码(newTags是一个Map<String, String>):

List<TagSet> tags = amazonS3.getBucketTaggingConfiguration(bucketName).getAllTagSets();
tags.add(new TagSet(newTags));
s3Service.setBucketTaggingConfiguration(bucketName, new BucketTaggingConfiguration(tags));

我什至没有使用 XML 我自己,这个错误对于实际出了什么问题没有帮助。发生了什么事?

Java API 和 REST API 之间有一点不匹配。看看 PUT Bucket Tag request。没有明确说明,但暗示每个 Tagging 集合只能有一个 TagSet。但是,BucketTaggingConfiguration 允许 TagSet 列表。

不要添加新的 TagSet,而是从配置中的第一个 TagSet 中获取 Map<String, String>,将您的标签添加到该地图,然后从中创建一个新的 TagSet。将 BucketTaggingConfiguration 视为仅允许 TagSet 的单项列表。

好的,终于弄明白了,但这是我的代码,用于说明如何在 S3 存储桶上放置多个标签。虽然代码暗示我可以添加多个 tagSet,但如果我这样做似乎会失败并出现上述错误。我刚刚用 mu

创建了一个 TagSet
public void TagS3(String bucketName, Map<String,String> tags){


    if(0 < tags.size()){
        TagSet ts = new TagSet(tags);
        BucketTaggingConfiguration btconfig = new BucketTaggingConfiguration();
        btconfig.withTagSets(ts);
        SetBucketTaggingConfigurationRequest tgRq =  new SetBucketTaggingConfigurationRequest(bucketName, btconfig);
        s3client.setBucketTaggingConfiguration(tgRq);
    }

}