我有一个自定义逻辑,它定义了jackson应该如何序列化和反序列化AWS lambda函数中的域对象。AWS lambda函数使用AWS lambda运行时java 11(amazon-corretto-11)部署在AWS上。序列化在本地测试时运行良好,但在AWS中不起作用。
您如何找出哪些java依赖项以及在AWS lambda运行时中实际使用的依赖项版本?
在我的具体案例中,我想要找出的是jackson依赖的版本。
发布于 2020-06-22 21:08:57
不要试图对运行时进行反向工程(这可能很难做到),而是尝试关注您的问题:运行库提供的序列化不起作用。
您可以做的是重构处理程序函数,使其不接受类的对象(这样,反序列化将在运行时进行,您将获得POJO),而接受原始请求(如果使用API Gateway,则使用来自com.amazonaws:aws-lambda-java-events的APIGatewayProxyRequestEvent )或InputStream。这样,您将获得原始有效负载,然后您可以根据需要对其进行解析。在AWS Lambda function handler in Java上阅读更多内容。您还需要在部署包中包含您的依赖项(google中的"fat jar")。
发布于 2020-06-30 00:33:47
@madhead:s answere应该是前进的方向。但我认为有一种方法可以了解一些反向工程涉及到哪些依赖项。
但首先,作为@jccampos mentions
你不应该依赖序列化框架的任何其他特性,比如注解。如果需要自定义序列化行为,可以使用原始字节流来使用自己的序列化。
据我所知,这段文字取自https://docs.aws.amazon.com/lambda/latest/dg/java-programming-model-req-resp.html
让AWS Lambda环境处理序列化和反序列化时,您无法控制。反序列化将发生在lambda函数之外,但在lambda环境中。AWS Lambda环境将使用自己的依赖项,而不是打包在您的lambda函数中。这就是为什么InputStream是一个更好的选择,因为你可以控制在淡化时使用哪个库。
亚马逊网络服务在反序列化时使用自己定制的杰克逊版本,并将其打包为com.amazonaws.thirdparty.jackson。如果您对所使用的版本感兴趣,可以下载maven项目aws-java-sdk-bundle,其中包含包含第三方库的jar (并解压jar以了解第三方库的版本)。我猜测lambda环境使用的是该依赖项的较新版本之一(也许某些版本可以帮助您通过源代码确认这一点)。
最后,我尝试将aws-java-sdk-bundle包含在maven中提供的作用域中,然后从lambda中打印出com.amazonaws.thirdparty.jackson.databind.ObjectReader的包信息。它导致了NoClassDefFoudError,这应该表明第三方jackson依赖项只能从lambda函数外部的AWS lambda环境访问。
https://stackoverflow.com/questions/62513512
复制相似问题