2016-06-10 102 views
6

我试图创建基于https://github.com/amzn/alexa-skills-kit-java一个HelloWorld的技能,但是当我测试的lambda函数它表明这个错误Alexa的技能套件-Lambda功能 - 无法验证SpeechletRequest(JAVA)

{ 
    "errorMessage":"com.amazon.speech.speechlet.SpeechletRequestHandlerException: Could not validate SpeechletRequest null using verifier ApplicationIdSpeechletRequestVerifier, rejecting request", 

    "errorType": "java.lang.RuntimeException", 

    "stackTrace": [ "com.amazon.speech.speechlet.lambda.SpeechletRequestStreamHandler.handleRequest(SpeechletRequestStreamHandler.java:101)", 
"helloworld.HelloWorldSpeechletRequestStreamHandler.handleRequest(HelloWorldSpeechletRequestStreamHandler.java:43)" 

], 

    "cause": { 

    "errorMessage": "Could not validate SpeechletRequest null using 
verifier ApplicationIdSpeechletRequestVerifier, rejecting request", 
    "errorType": "com.amazon.speech.speechlet.SpeechletRequestHandlerException", 

    "stackTrace": [ 
     "com.amazon.speech.speechlet.SpeechletRequestHandler.handleSpeechletCall(SpeechletRequestHandler.java:73)", 
     "com.amazon.speech.speechlet.lambda.SpeechletRequestStreamHandler.handleRequest(SpeechletRequestStreamHandler.java:98)", 
     "helloworld.HelloWorldSpeechletRequestStreamHandler.handleRequest(HelloWorldSpeechletRequestStreamHandler.java:43)" 
    ] 
    } 
} 

这是我的Java文件

public final class HelloWorldSpeechletRequestStreamHandler extends SpeechletRequestStreamHandler { 
    private static final Set<String> supportedApplicationIds = new HashSet<String>(); 
    static { 
     /* 
     * This Id can be found on https://developer.amazon.com/edw/home.html#/ "Edit" the relevant 
     * Alexa Skill and put the relevant Application Ids in this Set. 
     */ 
     supportedApplicationIds.add("amzn1.echo-sdk-ams.app.[amzn1.echo-sdk-ams.app.56bcdaf9-97fc-47f9-9918-43cb6a90d9f5]"); 
    } 


    public HelloWorldSpeechletRequestStreamHandler() { 
     super(new HelloWorldSpeechlet(), supportedApplicationIds); 
    } 
} 

我在想什么?

+0

你找出解决方案吗?如果是这样,你能分享吗?我有同样的问题。 – RommelTJ

回答

8

对我来说,我得到了这个异常,因为我试图运行我的lambda函数,没有正确的测试事件JSON在动作选项卡下。如果您单击“操作”选项卡,然后单击“配置测试事件”,则应该以JSON格式输入您可以解释的函数输入。看了很多后,我发现你可以通过开发者控制台获得这个JSON,在那里你使你的技能具备了你所有的技能配置。在左侧点击'测试'选项卡,然后进入'服务模拟器'部分。有一个文本框显示'输入话语',你可以在这里输入一个语音命令给你的功能,例如'Alexa tell yourApp'说你好。点击'Ask [yourApp]'按钮,在左边框上将生成一个Lambda请求JSON,输出在右边。然后,将左侧的JSON复制并粘贴到您的lambda控制台中的测试事件中,然后您应该很好。

+0

谢谢@Dan,我的代码中有两个问题。 1.将应用程序ID放在“[]”中,但不应该如此。 2.测试事件中错误的json格式。最后它的工作。 – PKTomar

0

我会将static代码放到您创建的延伸SpeechletLambda的类中。我相信,这是评估发生的地方,在这个类被加载并且它的静态代码被执行之前得到解决。

或者,您可以关闭验证。如果有人知道你的开发环境足够好,可以调用你的私有lambda函数,他们可能知道足以欺骗你的应用程序ID。所以验证它没有太多的安全价值。有关关闭它的示例,请参阅here

+0

我试图将我的自定义技能部署为AWS lambda函数,而不是作为Web服务**,所以扩展'Speechlet'而不是'SpeechServlet'。所以它不起作用。并且我想要关闭验证而开发。什么需要做任何建议请: - –

+0

我的坏。我已经更新了我的答案,并链接了一个Lambda示例。这几乎是一回事。 –

8

您在支持的应用程序ID中有错误的ID。该ID必须是“技能信息”页面上的“Alexa技能”应用程序的ID。它应该看起来像这样:

supportedApplicationIds.add("amzn1.ask.skill.c236d019-7d2a-5c96-a02f-ef8ab6f8e023"); 

我知道演示已经与[place id here]但你真的替换了整个事情。

+0

谢谢@mmaceachran – PKTomar

1

我试图创建一个包含在https://github.com/amzn/alexa-skills-kit-java中的地址技巧,但我得到了相同类型的错误。

事实证明,问题出现在DeviceAddressSpeechletRequestStreamHandler中,并在静态{}块中创建了Set<String> supportedApplicationIds的实例。

当我移动new HashSet<>();来声明类的属性时,它开始工作。