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

标签 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...",
...}

这可以通过这个简单的 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/

相关文章:

java - Wav 比较,相同的文件

java - 抽象计划服务 : shutdown underlying executor

java - 在 Java 中使用 RegEx 获取字符串

ios - 如何在 iOS 中发送和接收 Web 服务请求和响应?

amazon-web-services - 如何为 Coreos kubernetes aws 集群创建工作证书

ruby-on-rails - 外部 I18n 语言环境路径 (AWS)

java - == 和 equals() 之间的区别

php - 我的 Codeigniter 使用 ajax 自动完成

json - 在 Apache Drill 中取消嵌套的 JSON 结构

python - 迭代 S3 对象,而不仅仅是对象中的所有键/存储桶