自定义 Lambda Java 函数的序列化
Lambda Java 托管式运行时支持 JSON 事件的自定义序列化。自定义序列化可以简化代码并有可能提高性能。
何时使用自定义序列化
调用 Lambda 函数时,需要将输入事件数据反序列化为 Java 对象,并且需要将函数的输出序列化回可以作为函数响应返回的格式。Lambda Java 托管式运行时提供默认的序列化和反序列化功能,非常适合处理来自各种 AWS 服务的事件有效载荷,例如 Amazon API Gateway 和 Amazon Simple Queue Service(Amazon SQS)。要在函数中使用这些服务集成事件,请向项目中添加 aws-java-lambda-events
您也可以使用自己的对象来表示传递给 Lambda 函数的事件 JSON。托管式运行时会尝试将 JSON 序列化为对象的新实例,且该新实例具有其默认行为。如果默认序列化器无用例所需的行为,请使用自定义序列化。
例如,假设函数处理程序需要 Vehicle
类作为输入,并且此类具有以下结构:
public class Vehicle { private String vehicleType; private long vehicleId; }
但是,JSON 事件有效载荷如下所示:
{ "vehicle-type": "car", "vehicleID": 123 }
在这种情况下,托管式运行时中的默认序列化需要 JSON 属性名称与驼峰式大小写的 Java 类属性名称(vehicleType
、vehicleId
)相匹配。JSON 事件中的属性名称并非为驼峰式大小写(vehicle-type
、vehicleID
),因此必须使用自定义序列化。
实现自定义序列化
使用服务提供程序接口RequestHandler
接口将 JSON 事件有效载荷直接序列化为 Java 对象。
要在 Lambda Java 函数中使用自定义序列化
-
添加 aws-lambda-java-core
(作为依赖项)。此库包括 CustomPojoSerializer 接口,以及其他用于在 Lambda 中使用 Java 的接口定义。 -
在项目的
src/main/META-INF/services/
目录中创建名为com.amazonaws.services.lambda.runtime.CustomPojoSerializer
的文件。 -
在此文件中,指定自定义序列化器实现(该实现必须实现
CustomPojoSerializer
接口)的完全限定名称。例如:com.mycompany.vehicles.CustomLambdaSerialzer
-
实现
CustomPojoSerializer
接口以提供自定义序列化逻辑。 -
在 Lambda 函数中使用标准
RequestHandler
接口。托管式运行时将使用自定义序列化程序。
有关如何使用 fastJson、Gson、Moshi 和 jackson-jr 等常用库实现自定义序列化的更多示例,请参阅《AWS GitHub repository》中的 custom-serialization
测试自定义序列化
测试函数,确保序列化和反序列化逻辑按预期运行。您可以使用 AWS Serverless Application Model 命令行接口(AWS SAMCLI)来模拟 Lambda 有效载荷的调用。在引入自定义序列化器时,此举可以帮助您快速测试和迭代函数。
-
使用要调用函数的 JSON 事件有效载荷创建文件,然后调用 AWS SAM CLI。
-
运行 sam local invoke 命令,在本地调用函数。例如:
sam local invoke -e src/test/resources/event.json
有关更多信息,请参阅 Locally invoke Lambda functions with AWS SAM。