适用于Java AWS Lambda的POJO输入处理程序的大写字段

And*_*niy 5 java json amazon-web-services jackson aws-lambda

根据此处描述的文档: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...",
...}
Run Code Online (Sandbox Code Playgroud)

可以通过以下简单的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 + '\'' +
                    '}';
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在AWS控制台中为此lambda创建一个测试,并将以下json作为请求传递给它:

{
  "key3": "value3",
  "Key2": "value2",
  "Key1": "value1"
}
Run Code Online (Sandbox Code Playgroud)

日志中的结果将是:

2017-11-06 09:30:13 16849696-c2d5-11e7-80c3-150a37863c42 DEBUG TestLambda:15 - TestEvent{key1='null', Key2='null', key3='value3'}
Run Code Online (Sandbox Code Playgroud)

有什么办法可以反序列化此输入,而不必像在该主题中所建议的那样处理原始字节流?

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

如果我们不能为任何类型的事件自由创建POJO,那么对我来说,这似乎是Java AWS Lambda的一个很大限制。

jin*_*ngx -3

Java bean 上的属性仍然是,全部key2小写,因为序列化框架可见的属性名称是从 getter 派生的,而不是私有字段名称。所以它仍然进入输入事件寻找key2not Key2