使用JSON进行存储桶生命周期配置

时间:2019-02-26 17:15:07

标签: java amazon-web-services amazon-s3

我正在尝试在S3存储桶上应用生命周期配置。尝试使用以下JSON进行申请:

[{
"id": "tmpdelete",
"status": "Enabled",
"filter": {
    "predicate": {
        "prefix": "tmp"
    }
},
"transitions": [{
    "days": "1",
    "storageClass": "GLACIER"
}],
"noncurrentVersionTransitions": [{
    "days": "1",
    "storageClass": "GLACIER"
}],
"expirationInDays": "2",
"noncurrentVersionExpirationInDays": "2",
"expiredObjectDeleteMarker": "true"
}]

当我尝试使用Rule []。class映射它时,它不起作用。我正在使用以下代码:

    String json = above_json;
    Rule[] rules = null;

    Gson gson = new GsonBuilder().serializeNulls().excludeFieldsWithModifiers(Modifier.FINAL,
        Modifier.TRANSIENT, Modifier.STATIC, Modifier.ABSTRACT).create();
    rules = gson.fromJson(json, Rule[].class);

    try {

        amazonS3.setBucketLifecycleConfiguration(bucketName, new BucketLifecycleConfiguration().withRules(rules));
    } catch (Exception e) {
        throw e;
    }

它抛出错误,提示无法调用无参数的公共com.amazonaws.services.s3.model.lifecycle.LifecycleFilterPredicate()。 LifecycleFilterPredicate是一个实现Serializable的抽象类,它没有no-args构造函数。如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

好吧,我想我发现了你的问题:当GSON尝试将json字符串中的对象构造成实际对象(或者在这种情况下,是对象列表)时,该过程失败,因为它到达过滤器时.predicate位,它可能会尝试执行以下操作:

LifecycleFilterPredicate predicate = new LifecycleFilterPredicate();
predicate.setPrefix("tmp");

这是行不通的,因为LifecycleFilterPredicate没有如您所说的没有任何参数的公共构造函数。

不幸的是,我认为您唯一的解决方案是以不同的方式解析JSON。

更新

您将需要如下使用GSON TypeAdapter:

class LifecycleFilterPredicateAdapter extends TypeAdapter<LifecycleFilterPredicate>
{
    @Override
    public LifecycleFilterPredicate read(JsonReader reader)
        throws IOException
    {
        if (reader.peek() == JsonToken.NULL) {
            reader.nextNull();
            return null;
        }
        reader.beginObject();
        if(!"prefix".equals(reader.nextName()))
        {
            return null;
        }
        String prefix = reader.nextString();
        LifecyclePrefixPredicate predicate = new LifecyclePrefixPredicate(prefix);
        reader.endObject();
        return predicate;
    }

    @Override
    public void write(JsonWriter writer, LifecycleFilterPredicate predicate)
        throws IOException
    {
        //nothing here
    }
}
...
Gson gson = new GsonBuilder().serializeNulls().excludeFieldsWithModifiers(Modifier.FINAL,
            Modifier.TRANSIENT, Modifier.STATIC, Modifier.ABSTRACT)
            .registerTypeAdapter(LifecycleFilterPredicate.class, new LifecycleFilterPredicateAdapter()).create();

我已经在本地尝试过了,不再遇到异常了:)

答案 1 :(得分:0)

public class RuleInstanceCreator implements InstanceCreator<LifecycleFilterPredicate> {

    @Override
    public LifecycleFilterPredicate createInstance(Type type) {

        return new LifecycleFilterPredicate() {

            private static final long serialVersionUID = 1L;

            @Override
            public void accept(LifecyclePredicateVisitor lifecyclePredicateVisitor) {
            }

        };
    }

}

    Gson gson = new GsonBuilder()
            .registerTypeAdapter(LifecycleFilterPredicate.class, new LifecycleFilterPredicateAdapter()).create();

    rules = gson.fromJson(json, Rule[].class);