Java dialogState==完成后如何重新获得控制,Alexa delegateDialog

Java dialogState==完成后如何重新获得控制,Alexa delegateDialog,java,json,alexa,alexa-skills-kit,alexa-intent,Java,Json,Alexa,Alexa Skills Kit,Alexa Intent,我有一个正常工作的对话框,我将此对话框委托给Alexa,用于intent BeginDiagnosis,提示用户填写年龄和性别的槽值,这是BeginDiagnosis的槽。但是,当最后一个插槽值已填充且dialogState==“COMPLETED”时,而不是由处理程序捕获intent BeginDiagnosisInt,然后在填充给定插槽值的情况下执行我打算执行的行为。ErrorHandler捕获响应并抛出错误 如何控制对话框,以便在dialogState完成时,我能够执行希望在给定插槽已填满

我有一个正常工作的对话框,我将此对话框委托给Alexa,用于intent BeginDiagnosis,提示用户填写年龄和性别的槽值,这是BeginDiagnosis的槽。但是,当最后一个插槽值已填充且dialogState==“COMPLETED”时,而不是由处理程序捕获intent BeginDiagnosisInt,然后在填充给定插槽值的情况下执行我打算执行的行为。ErrorHandler捕获响应并抛出错误

如何控制对话框,以便在dialogState完成时,我能够执行希望在给定插槽已填满的情况下执行的功能

{
  "interactionModel": {
    "languageModel": {
      "invocationName": "diagnose",
      "intents": [
        {
          "name": "BeginDiagnosisIntent",
          "slots": [
            {
              "name": "age",
              "type": "AMAZON.NUMBER"
            },
            {
              "name": "gender",
              "type": "GENDER"
            }
          ],
          "samples": [
            "{age}",
            "I am {age}",
            "I'm {age}",
            "I am {age} years",
            "I'm {age} years",
            "I am {age} years old",
            "I'm {age} years old",
            "I was born {age} years ago",
            "I am the old age of {age}",
            "I am the ripe old age of {age}",
            "I am {gender}"
          ]
        },
        {
          "name": "AMAZON.RepeatIntent"
        },
        {
          "name": "AMAZON.HelpIntent"
        },
        {
          "name": "AMAZON.StopIntent"
        },
        {
          "name": "AMAZON.CancelIntent"
        }
      ],
      "types": [
        {
          "name": "GENDER",
          "values": [
            {
              "name": {
                "value": "female",
                "synonyms": [
                  "girl",
                  "woman"
                ]
              }
            },
            {
              "name": {
                "value": "male",
                "synonyms": [
                  "boy",
                  "man"
                ]
              }
            }
          ]
        }
      ]
    },
    "dialog": {
      "delegationStrategy": "ALWAYS",
      "intents": [
        {
          "name": "BeginDiagnosisIntent",
          "prompts": {},
          "slots": [
            {
              "name": "age",
              "type": "AMAZON.NUMBER",
              "confirmationRequired": false,
              "elicitationRequired": true,
              "prompts": {
                "elicitation": "Elicit.Slot.1323207333291.854898796228"
              }
            },
            {
              "name": "gender",
              "type": "GENDER",
              "confirmationRequired": false,
              "elicitationRequired": true,
              "prompts": {
                "elicitation": "Elicit.Slot.1323207333291.563366041005"
              }
            }
          ]
        }
      ]
    },
    "prompts": [
      {
        "id": "Elicit.Slot.1323207333291.854898796228",
        "variations": [
          {
            "type": "PlainText",
            "value": "How old are you?"
          }
        ]
      },
      {
        "id": "Elicit.Slot.1323207333291.563366041005",
        "variations": [
          {
            "type": "PlainText",
            "value": "Are you male of female?"
          }
        ]
      }
    ]
  }
}
在launchHandler中,我将对话框委托给BeginDiagnosinent。然后,我希望Alexa处理这个对话框,当插槽被填满时,我可以继续从BeginDiagnosisInthentHandler开始。 但是,当对话框状态完成时。我的错误处理程序捕获响应。为什么会发生这种情况?对话框完成后,如何恢复上下文

public class LaunchHandler implements LaunchRequestHandler {

    @Override
    public boolean canHandle(HandlerInput handlerInput, LaunchRequest launchRequest) {
        return true;
    }

    @Override
    public Optional<Response> handle(HandlerInput handlerInput, LaunchRequest launchRequest) {
        Intent chainedIntent = Intent.builder().withName("BeginDiagnosisIntent").build();
        return handlerInput.getResponseBuilder()
                .addDelegateDirective(chainedIntent)
                .build();
    }
}


public class BeginDiagnosisIntentHandler implements IntentRequestHandler {

    @Override
    public boolean canHandle(HandlerInput input, IntentRequest intentRequest) {
        return intentRequest.getIntent().getName().equals("BeginDiagnosisIntent");
    }

    @Override
    public Optional<Response> handle(HandlerInput handlerInput, IntentRequest intentRequest) {
        Intent currentIntent = intentRequest.getIntent();

        if (intentRequest.getDialogState().equals("COMPLETED")) {
            return handlerInput.getResponseBuilder()
                    .withSpeech("I have all the information I need.")
                    .build();
        } else {
                return handlerInput.getResponseBuilder()
                        .addDelegateDirective(currentIntent)
                        .build();
        }

    }

}
公共类LaunchHandler实现LaunchRequestHandler{
@凌驾
公共布尔canHandle(HandlerInput HandlerInput,LaunchRequest LaunchRequest){
返回true;
}
@凌驾
公共可选句柄(HandlerInput HandlerInput、LaunchRequest LaunchRequest){
Intent chainedIntent=Intent.builder().withName(“BeginDiagnosinent”).build();
return handlerInput.getResponseBuilder()
.addDelegateDirective(chainedIntent)
.build();
}
}
公共类BeginDiagnosintHandler实现IntentRequestHandler{
@凌驾
公共布尔canHandle(HandlerInput输入,IntentRequest IntentRequest){
返回intentRequest.getIntent().getName().equals(“BeginDiagnosinent”);
}
@凌驾
公共可选句柄(HandlerInput HandlerInput、IntentRequest IntentRequest){
Intent currentIntent=intentRequest.getIntent();
if(intentRequest.getDialogState().equals(“COMPLETED”)){
return handlerInput.getResponseBuilder()
.withSpeech(“我有我需要的所有信息。”)
.build();
}否则{
return handlerInput.getResponseBuilder()
.addDelegateDirective(currentIntent)
.build();
}
}
}