当前位置: 首页 > 知识库问答 >
问题:

Amazon Lambda上Amazon Echo/Alexa的正确Java HandlerRequest()方法签名?

沙宣
2023-03-14

我正在尝试创建一个用Java实现的Amazon Lambda函数,以便与Amazon Echo/Alexa一起使用。我使用Eclipse Mars作为IDE。

下面是我的< code > lambdafunchandler ,它将接收来自Alexa的请求,如下所示:

public class LambdaFunctionHandler implements RequestHandler<SpeechletRequestEnvelope, SpeechletResponse> {

    @Override
    public SpeechletResponse handleRequest(SpeechletRequestEnvelope input, Context context) {
        context.getLogger().log("Input: " + input);

        // TODO: implement your handler
        return null;
    }
}

但是,当尝试使用来自Alexa的示例JSON输入对此进行测试时,我在Eclipse中得到了错误:

{"errorMessage":"JSON解析过程中发生错误","errorType":"_findFields","stackTrace":[],"原因":{"errorMessage":"Lcom/Fast erxml/jackson/datind/ObjectMapper;","errorType":"_addFields","stackTrace":["_createDeserializer0(本机方法)","_createAndCache2(_createAndCacheValueDeserializer)","_prefetchRootDeserializer(DeserializerCache.java:330)","com.fasterxml.jackson.databind.deser.DeserializerCache.BasicClassIntrospector.java:110(DeserializerCache.java:265)","com.fasterxml.jackson.databind.deser.DeserializerCache.(DeserializerCache.java:245)","com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:143)","com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.forDeserialization(POJOPropertiesCollector.java:390)","com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.collect(POJOPropertiesCollector.java:243)"com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.collectProperties(BasicClassIntrospector.java:197)"com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.forDeserialization(java.lang.RuntimeException)","java.lang.NoClassDefFoundError(java.lang.Class.getDeclaredFields)","com.fasterxml.jackson.databind.DeserializationConfig.introspect(DeserializationConfig.java:703)","java.lang.Class.getDeclaredFields(Class.java:1916)","com.fasterxml.jackson.databind.introspect.AnnotatedClass.java.lang.Class.privateGetDeclaredFields(AnnotatedClass.java:689)","com.fasterxml.jackson.databind.introspect.AnnotatedClass.resolveFieldsClass.java:2583(AnnotatedClass.java:470)","com.fasterxml.jackson.databind.introspect.AnnotatedClass.fields(AnnotatedClass.java:282)"ObjectReader. java: 185)","com. Fast erxml. jackson.数据库. ObjectMapper._newReader(ObjectMapper. java: 558)","com. Fast erxml. jackson.数据库. ObjectMapper. Reader(ObjectMapper. java: 3098)"],"原因":{"errorMessage":"com. Fast erxml. jackson.数据库. ObjectMapper","errorType":"java. lang. ClassNotFoundException","stackTrace":["java. net. URLClassLoader. findClass(URLClassLoader. java: 381)","java. lang. ClassLoader. loadClass(ClassLoader. java: 424)","java. lang. ClassLoader. loadClass(ClassLoader. java: 357)",".(ObjectReader. java: 185)","com. Fast erxml. jackson.数据库. ObjectMapper._newReader(ObjectMapper. java: 558)","com. Fast erxml. jackson.数据库. ObjectMapper. Reader(ObjectMapper. java: 3098)"]}}}

以下是我的JSON输入(取自在线TestColors示例):

{
  "session": {
    "new": false,
    "sessionId": "session1234",
    "attributes": {},
    "user": {
      "userId": null
    },
    "application": {
      "applicationId": "amzn1.echo-sdk-ams.app.[unique-value-here]"
    }
  },
  "version": "1.0",
  "request": {
    "intent": {
      "slots": {
        "Color": {
          "name": "Color",
          "value": "red"
        }
      },
      "name": "MyColorIsIntent"
    },
    "type": "IntentRequest",
    "requestId": "request5678"
  }
}

因此,显然Amazon < code > SpeechletRequestEnvelope 不是< code>handleRequest()的正确输入类。

< code>handleRequest()从Alexa接收请求的正确方法签名是什么?

我找不到与Alexa /Echo一起使用的亚马逊Lambda的Java示例。

共有2个答案

龙弘盛
2023-03-14

我扩展了jo . echo . lambda . utils . speechletlambda(https://github . com/jjaquinta/echopropoofconcepts/blob/master/jo . echo . lambda/jo/echo/lambda/utils/speechletlambda . Java ),这适用于我:

@Override
public void handleRequest(InputStream inputStream,
        OutputStream outputStream, Context context) throws IOException
{
    super.handleRequest(inputStream, outputStream, context);
}

希望这有所帮助

曹建华
2023-03-14

下面是一个完整的工作示例:

public class LambdaFunctionHandler implements RequestStreamHandler {

    @Override
    public void handleRequest(InputStream inputStream, OutputStream output, Context context) throws IOException {
        byte serializedSpeechletRequest[] = IOUtils.toByteArray(inputStream);
        SpeechletRequestEnvelope requestEnvelope = SpeechletRequestEnvelope.fromJson(serializedSpeechletRequest);
        SpeechletRequest speechletRequest = requestEnvelope.getRequest();

        if (speechletRequest instanceof IntentRequest) {
            IntentRequest ir = (IntentRequest) speechletRequest;
            String outString = "IntentRequest name: " + ir.getIntent().getName();
            context.getLogger().log(outString);
            output.write(outString.getBytes());
        }
    }
}

请注意,这个类实现了<code>RequestStreamHandler,而不是<code>请求处理程序。

使用问题中的输入JSON,output.write(outString.getBytes())将导致输出到Eclipse AWS Lambda控制台:

====================函数输出===============

IntentRequest名称:MyColorisinent

...while context.getLogger()。log(输出字符串);会导致同一行被在线写入Amazon Lambda控制台。

您还需要确保您的项目中有一个文件夹/lib,并且需要包含以下JAR:

    < li>commons-codec-1.6.jar < li>commons-lang3-3.x.jar < Li > Jackson-annotations-2 . 3 . 2 . jar < li>jackson-core-2.3.2.jar < Li > Jackson-databind-2 . 3 . 2 . jar < Li > Jakarta commons-IO-2.4 . jar < li>joda-time-2.3.jar < li>log4j.1.2.17.jar < li>servlet-api-3.0.jar < li>slf4j-api-1.7.4.jar < li>slf4j-log4j12-1.7.4.jar < Li > Alexa-skills-kit-1.0 . jar

这些JAR可以从Maven Central或AlexaSkillsKit.zip中的“第三方”子文件夹下载。

在Eclipse中,您需要刷新项目,以便它看到< code>/lib目录中的JAR文件(只需点击F5),然后将JAR添加到Java构建路径:

  1. 在Eclipse中右键单击Lambda项目的根。
  2. 单击“属性”
  3. 选择“Java构建路径”
  4. 选择“库”选项卡
  5. 单击“添加罐子”
  6. 浏览到“库”
  7. 选择“lib”文件夹中的所有JAR,然后单击“Ok”,直到返回到Eclipse主屏幕

感谢@jephers指向Github上这个伟大教程的指针,我从中拼凑了很多以下内容:

https://github.com/jjaquinta/EchoProofOfConcepts/tree/master/jo.echo.lambda

 类似资料:
  • 问题内容: 我正在使用和 (Bouncycastle库) 签署,然后验证。 这是我签署的: 现在,输出将在这一过程中使用的: 一切正常,直到由于以下原因: 有人可以给我提示可能发生的事情吗? PS 。如果有人要进行上述测试,则将需要我用来复制此文件的测试文件,只需从这里开始即可: https://www.dropbox.com/s/zs4jo1a86v8qamw/certificates.p12?

  • 我正在使用和(Bouncycastle库)对进行签名,然后验证。 由于以下,: 谁能给我一个可能会发生什么事的提示吗? ps.如果有人想要测试上面的您将需要我正在使用的测试文件来复制该文件,只需从此处即可: https://www.dropbox.com/s/zs4jo1a86v8qamw/certifications.p12?dl=0

  • 我正在尝试为生产中的顶点类实现一个简单的更改。我有正确的类和正确的测试类。测试类在沙盒中成功运行,没有错误,但显然错误来自Salesforce中的TestHelper默认测试类。当尝试在生产中部署时,它会抛出错误“方法不存在或签名不正确:TestHelper类型中的空createUser(Id、String、String、Date、Intger)” 我尝试过将其引用的方法更改为public sta

  • 当我试图验证来自WooCommerce webhooks的签名时,我遇到了一个奇怪的问题。以下是我用来创建签名的部分: 它适用于每个带有主题的网络钩子,请求正文等于这样的内容: 不幸的是,对于每个具有或主题的网络钩子,我的签名都不一样。请求正文也更复杂。 我认为JSON出现了一些问题。当请求正文更复杂时,使用stringify()。 验证来自WooCommerce webhooks的签名的正确方法

  • 所以我有一个Java应用程序,它使用一个固定的线程池来执行一些代码。此代码包括使用输出到系统的第三方库。犯错误当我让这段代码执行单线程时,我“重定向”了系统。错误为最终打印到log4j日志的打印流。基本上是这样的: 这按预期工作。输出打印到日志文件而不是控制台,我可以通过更改log4j配置完全删除输出。完美。 当我开始添加多线程时,我做了一些研究,遇到了这样一个问题:在多线程Java程序中,每个线

  • 本文向大家介绍web.py获取上传文件名的正确方法,包括了web.py获取上传文件名的正确方法的使用技巧和注意事项,需要的朋友参考一下 直接切入主题,从HTML页面上传文件,Python接收处理。但其中发现有些小问题,把它写出来,算是积累吧! HTML页面代码: Python处理部分代码: 执行结果切提示: 提示这个对象没有找到filename这个属性,一开始以为是接收对象错了,于是我直接 结果能