如果我有一个
import lombok.Value;
@Value
public class IncomingRequest {
String data;
}
并尝试拥有
RequestHandler
喜欢
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class LambdaHandler implements RequestHandler<IncomingRequest, String> {
@Override
public String handleRequest(IncomingRequest request, Context context) {
...
}
}
我只得到空的
request
对象,或者使用其他一些配置我得到反序列化异常。
我需要做什么才能使 AWS Lambda 正确反序列化到我的自定义类中?
AWS Lambda 使用 Jackson 反序列化数据,因此需要一个无参数构造函数和属性设置器。您可以将这些设置器公开,但此时您有一个可变类,并且您通常不希望将其用于纯数据类。 “幸运的是”杰克逊无论如何都使用反射,因此可以(并且确实)访问私有方法。因此,您可以使用
而不是
@Value
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter(AccessLevel.PRIVATE)
public class IncomingRequest {
String data;
}
这样 Jackson 就可以正确解析传入的 JSON,并且您的类仍然保持不可变。显然,如果您愿意,只要确保无参数构造函数仍然存在,您就可以通过注释向该类添加更多构造函数。添加如果您愿意,您也可以安全地添加
@ToString @EqualsAndHashCode
。
您可以在
@Jacksonized @Builder
上使用 IncomingRequest
。 Jackson 将使用该构建器来创建实例,并且您的类将保持不可变。