我正在尝试在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构造函数。如何解决这个问题。
答案 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);