Конфигурация жизненного цикла Bucket с использованием json - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь применить конфигурации жизненного цикла к корзине 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 []. Это не работает.Я использую следующий код:

    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 и не имеет конструктора без аргументов.Как решить эту проблему .?

Ответы [ 2 ]

0 голосов
/ 02 марта 2019
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);
0 голосов
/ 02 марта 2019

Хорошо, я думаю, что нашел вашу проблему: когда GSON пытается построить объекты из этой строки json в реальный объект (или, в данном случае, список объектов), процесс завершается неудачно, потому что, когда он попадает в фильтрНемного .predicate, вероятно, он пытается сделать что-то вроде этого:

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

Что не работает, потому что у LifecycleFilterPredicate нет открытого конструктора без каких-либо аргументов, как вы заявили.

Я думаю, что, к сожалению, ваше единственное решение состоит в том, чтобы проанализировать JSON по-другому.

ОБНОВЛЕНИЕ

Вам потребуется использовать адаптер типа GSON следующим образом:

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();

Я попробовал его локально и больше не получаю исключение:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...