jackson 如何将传入的AWS Lambda请求反序列化为lombok @Value或@Data类?

oyxsuwqo  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(128)

如果我有

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正确地反序列化到我的自定义类中?

sf6xfgos

sf6xfgos1#

AWS Lambda使用Jackson来反序列化数据,因此需要一个无参数的构造函数和属性的setter。您可以将这些setter设置为公共的,但此时您有一个可变类,您通常不希望将其用于纯数据类。“幸运的是”Jackson无论如何都使用反射,因此可以(并且确实)访问私有方法。因此,您可以使用@Value而不是

import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter(AccessLevel.PRIVATE)
public class IncomingRequest {
    String data;
}

这样Jackson就可以正确解析传入的JSON,而类仍然是不可变的。显然,如果你想的话,你可以通过注解向该类添加更多的构造函数,只要你确保一个无参数的构造函数仍然存在。如果你想的话,你也可以安全地添加@ToString @EqualsAndHashCode

klsxnrf1

klsxnrf12#

您可以在IncomingRequest上使用@Jacksonized @Builder。Jackson将使用该构建器创建示例,并且您的类将保持不变。

相关问题