Шаговая функция AWS с лямбда-ошибкой при вводе JSON-функции - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть AWS Step Function, который вызывает Lambda Function s для каждого состояния, и я передаю LinkedList из PartETag объектов из одного состояния в другое для MultipartUpload.

Не уверен, поможет ли это, но вот фрагмент кода:

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

import UploadJob;
import UploadJobParameters;

public class JobFinishHandler implements RequestHandler<ExportJobParameters, ExportJobParameters> {

    @Override
    public ExportJobParameters handleRequest(ExportJobParameters parameters, Context context) {

        UploadJob uploadJob = new UploadJob(parameters, context);
        context.getLogger().log("JobFinishHandler");
        context.getLogger().log("parameters: " + parameters.toString());
        context.getLogger().log("parameters.getPartETags().size(): " + parameters.getPartETags().size());
        context.getLogger().log(parameters.getPartETags().toString());
        context.getLogger().log("parameters.getPartETags().hashCode(): " + parameters.getPartETags().hashCode());
        uploadJob.continueS3UploadStream();
        uploadJob.jobFinish();
        uploadJob.jobAbort();
        return parameters;
    }

}

Это ввод для состояния:

{ "uploadId":"1234567890", "partETags":[ { "partNumber":1, "ETag":"67c335990ba21ff95db1d09a3c2c4a11" } ] }

Я получаю эту ошибку:

An error occurred during JSON parsing: java.lang.RuntimeException
java.lang.RuntimeException: An error occurred during JSON parsing
Caused by: java.io.UncheckedIOException: com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class com.amazonaws.services.s3.model.PartETag]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)
at [Source: lambdainternal.util.NativeMemoryAsInputStream@369f73a2; line: 1, column: 458] (through reference chain: gov.osdls.exportservices.export.common.ExportJobParameters["partETags"]->java.util.ArrayList[0])
Caused by: com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class com.amazonaws.services.s3.model.PartETag]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)
at [Source: lambdainternal.util.NativeMemoryAsInputStream@369f73a2; line: 1, column: 458] (through reference chain: gov.osdls.exportservices.export.common.ExportJobParameters["partETags"]->java.util.ArrayList[0])
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1106)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:296)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:133)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:217)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:25)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:520)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:95)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:258)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:125)
at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1511)
at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1102)

Я проверил класс PartETag, чтобы увидеть, есть ли конструктор по умолчанию, и нет, поэтому я собираюсь переопределить этот класс и сделать конструктор по умолчанию.Но я чувствую, что, поскольку PartETag является объектом Амазонки, разве они не подумали об этом уже?Я делаю это неправильно?Есть лучший способ сделать это?

1 Ответ

0 голосов
/ 26 апреля 2018

На всякий случай, если кто-то ищет ответ на этот вопрос, я просто создал пользовательский класс, который расширяет PartETag и преобразовал список перед заполнением MultipartUpload:

import com.amazonaws.services.s3.model.PartETag;
import com.amazonaws.util.json.Jackson;

public class PartETagExt extends PartETag {

    public PartETagExt() {
        super(0, "a");
    }

    public PartETagExt(PartETag partETag) {
        super(partETag.getPartNumber(), partETag.getETag());
    }

    @Override
    public String toString() {
        return Jackson.toJsonString(this);
    }
}

, а затем преобразовалсписок к обычному PartETag:

List<PartETag> partETags = new LinkedList<PartETag>();
partETags.addAll(partETagExts);
CompleteMultipartUploadRequest compRequest = 
                new CompleteMultipartUploadRequest(bucket, key, uploadId, partETags);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...