在我的web应用程序中,我使用以下参数调用lambda函数:
{
FunctionName: 'myFunctionName',
ClientContext: btoa(JSON.stringify({ myCustomObject }))
};
当我的函数在javascript中实现时(在'node.js 12.x'运行时中),我通常可以访问context.clientcontext.mycustomobject,并且所有内容都可用。
但是,当我将同一函数的实现切换到java时(我使用“Java11(corretto)”、“Java8(corretto)”和“Java8”运行时进行了测试),没有对客户机进行任何更改,客户机上下文看起来是空的(尽管它不是空的):
context.getClientContext(): lambdainternal.api.LambdaClientContext@2353b3e6
context.getClientContext().getCustom(): null
context.getClientContext().getClient(): null
context.getClientContext().getEnvironment(): null
gson.toJson(context.getClientContext()): {}
我希望在context.getclientcontext().getcustom()Map中看到mycustomobject。这是虫子吗?客户机上下文对用java实现的lambdas不可用吗?还是我遗漏了什么?
我的java处理程序代码如下:
package com.mycompany;
import java.util.Map;
import com.amazonaws.services.lambda.runtime.Context;
public class LambdaMethodHandler {
public Map<String, String> handleRequest(String input, Context context) {
context.getLogger().log("Input: " + input);
if (context.getClientContext() == null || context.getClientContext().getCustom() == null || context.getClientContext().getCustom().get("myCustomObject") == null) {
return Map.of(
"statusCode", "403",
"body", "Forbidden. Please provide custom object in Client Context."
);
}
return Map.of("body", "Hello World LambdaMethodHandler - " + input);
}
}
从文档中,我看到clientcontext通常应该只用于移动应用程序(这里不是这样)。不过,如果它能在javascript实现中工作,我希望它能在其他语言中始终如一地工作。
2条答案
按热度按时间zte4gxcn1#
通过反复试验,我发现如果lambda调用中提供的客户机上下文对象有一个键“custom”:
可以通过调用
我仍然不知道这是设计的,还是java处理程序实现的一个意想不到的怪癖。我不会将此标记为已接受的答案,希望有人能够对我的错误或正确使用客户端上下文的方法提供更好的解释。
xoshrz7s2#
您需要提供一个可以序列化到java对象中的clientcontext。
如果你检查源代码,它会使用gson将其反序列化为
LambdaClientContext
对象。i、 如果你通过这样的物体,它应该会起作用