AWS Lambda json 反序列化 with jackson annotations

2022-09-02 01:07:50

我用 json body 调用 aws lambda。因此,json的字段与POJO中的字段具有不同的名称。所以我所做的是在字段上添加@JsonProperty,告诉杰克逊json中的名字是什么。但是由于某种原因,它似乎无法识别它们,并且所有字段都为空。如果我传递一个与POJO具有相同字段名称的json,它就可以工作了。这是我的课程:

public class Event implements Identifiable {

    @JsonProperty("distinct_id")
    private String distinctId;

    @JsonProperty("user_id")
    private Integer userId;

    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    private LocalDateTime eventDateTime;

    //Here are the getters and setters
}

如果我通过

{"distinct_id":"123", "user_id":123, "dt":"2017-01-04T08:45:04+00:00"} 

所有字段都是空的,并且使用dileId,userId,eventDateTime,它正在序列化,除了它也不能识别我的自定义序列化程序/反序列化程序,但这实际上是同样的问题。

我的结论是,由于某种原因,aws jackson没有使用注释,但它没有意义。


答案 1

所以我找到了一种方法来做到这一点。您需要实现 RequestStreamHandler,它为您提供了可以使用的输入和输出流:

import com.amazonaws.services.lambda.runtime.RequestStreamHandler

public class ChartHandler implements RequestStreamHandler {
    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
        DeserializationClass deserializedInput = objectMapper.readValue(inputStream, DeserializationClass.class)
        objectMapper.writeValue(outputStream, deserializedInput); //write to the outputStream what you want to return
    }

}

拥有输入和输出流可以独立于用于解析它的格式和框架。


答案 2

请看一下 AWS 文档中的这句话:

不应依赖序列化框架的任何其他功能,如批注。如果需要自定义序列化行为,可以使用原始字节流来使用自己的序列化。

寄件人: https://docs.aws.amazon.com/lambda/latest/dg/java-programming-model-req-resp.html


推荐