使用jackson注释进行AWS Lambda json反序列化

Hri*_*lov 13 java jackson aws-lambda

我正在用一个json体调用aws lambda.所以json的字段与POJO中的字段名称不同.所以我做的是在字段上添加@JsonProperty告诉jackson 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
}
Run Code Online (Sandbox Code Playgroud)

如果我通过

{"distinct_id":"123", "user_id":123, "dt":"2017-01-04T08:45:04+00:00"} 
Run Code Online (Sandbox Code Playgroud)

所有字段都为null,并且使用distinctId,userId,eventDateTime,它正在序列化,但它也无法识别我的自定义序列化器/反序列化器,但这实际上是同样的问题.

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

Hri*_*lov 16

所以我找到了一种方法来做到这一点.您需要实现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
    }

}
Run Code Online (Sandbox Code Playgroud)

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


jcc*_*pos 8

看看 AWS 文档中的这句话:

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

来自:https : //docs.aws.amazon.com/lambda/latest/dg/java-programming-model-req-resp.html