根据此处描述的文档:http://docs.aws.amazon.com/lambda/latest/dg/java-programming-model-req-resp.html可以创建自己的 POJO 来序列化 Java AWS Lambda 的输入和输出。
但是,对于大写字段的输入请求,它似乎无法正常工作。例如,自定义资源 lambda 的输入格式如下所示:
{"RequestType":"Create",
"ServiceToken":"arn:aws:lambda:....",
"ResponseURL":"https://cloudformation-custom-resource-response-e...",
...}
这可以通过这个简单的 MCVE 代码轻松测试:
package test;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class TestLambda implements RequestHandler<TestLambda.TestEvent, String> {
private static final Logger logger = LogManager.getLogger(TestLambda.class);
@Override
public String handleRequest(TestEvent event, Context context) {
logger.debug(event.toString());
return null;
}
public static final class TestEvent {
private String key1;
private String Key2;
private String key3;
public String getKey1() {
return key1;
}
public void setKey1(String key1) {
this.key1 = key1;
}
public String getKey2() {
return Key2;
}
public void setKey2(String key2) {
Key2 = key2;
}
public String getKey3() {
return key3;
}
public void setKey3(String key3) {
this.key3 = key3;
}
@Override
public String toString() {
return "TestEvent{" +
"key1='" + key1 + '\'' +
", Key2='" + Key2 + '\'' +
", key3='" + key3 + '\'' +
'}';
}
}
}
然后在 AWS 控制台中为此 lambda 创建一个测试,并将以下 json 作为请求传递到那里:
{
"key3": "value3",
"Key2": "value2",
"Key1": "value1"
}
日志中的结果将是:
2017-11-06 09:30:13 16849696-c2d5-11e7-80c3-150a37863c42 DEBUG TestLambda:15 - TestEvent{key1='null', Key2='null', key3='value3'}
是否有任何方法可以反序列化此输入,而无需像他们在该主题中建议的那样处理原始字节流?
You shouldn't rely on any other features of serialization frameworks such as annotations. If you need to customize the serialization behavior, you can use the raw byte stream to use your own serialization.
如果我们不能为任何类型的事件自由创建 POJO,这在我看来是 Java AWS Lambdas 的一个很大限制。
最佳答案
在 pojo 中,将字段设置为 public 并且与 json 字段的大小写完全相同。这意味着你应该有大写驼峰字段,例如,
public class TestEvent {
public String Key1;
public String Key2;
public String key3;
}
我无法解释为什么这行得通,但我今天根据同事的建议尝试了这个并且行得通。我知道它看起来不优雅。但至少它的代码行数比反序列化流少。
关于java - 用于 Java AWS Lambda 的 POJO 输入处理程序的大写字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47133792/