Java Webhook-迁移到v2-无法将queryResult设置为java.util.LinkedHashMap

use*_*357 5 java dialogflow-es

我正在将dialogflow v1和spring boot java用作webhook,使用:http ://mvnrepository.org/artifact/ai.api/libai/1.6.12

现在,我尝试使用以下方法升级到dialogflow v2:http ://mvnrepository.org/artifact/com.google.apis/google-api-services-dialogflow/v2-rev2-1.23.0

<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-dialogflow</artifactId>
    <version>v2-rev2-1.23.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

目的:这样我就不必自己解析/构建json了,我已经在mvnrepository搜索中找到了它

我截获了这个json:

{
    "responseId": "72945ef4-0897-4705-a770-a12100162b45",
    "queryResult": {
        "queryText": "was gibts neues?",
        "action": "GetNewsFromWordpress",
        "parameters": {
            "allRequiredParamsPresent": true
        },
        "name": "projects/kreamont-abf6b/agent/intents/fe2c13a1-2e3f-48eb-a15a-660501c16807",
        "diagnosticInfo": {

        }
    },
    "languageCode": {
        "intentDetectionConfidence": 1.0
    },
    "displayName": {
        "payload": {

        }
    },
    "session": "projects/kreamont-abf6b/agent/sessions/e69aabe7-4f6a-4224-b881-8bbf31835ef2"
}           
Run Code Online (Sandbox Code Playgroud)

杰克逊无法以某种方式绑定模型。我如何使用一些Java库,这样我就不必自己解析json了?

com.fasterxml.jackson.databind.JsonMappingException:无法将com.google.api.services.dialogflow.v2.model.GoogleCloudDialogDialogV2QueryResult字段com.google.api.services.dialogflow.v2.model.GoogleCloudDialogflowV2WebhookRequest.queryResult设置为java.util .LinkedHashMap(通过参考链:com.google.api.services.dialogflow.v2.model.GoogleCloudDialogflowV2WebhookRequest [“ queryResult”])

@RequestMapping(method = RequestMethod.POST, path = "fulfillment", consumes = MediaType.APPLICATION_JSON_VALUE)
public GoogleCloudDialogflowV2WebhookResponse getFulfillment(@RequestBody GoogleCloudDialogflowV2WebhookRequest request) {
    // HttpMessageNotReadableException 
    ...
Run Code Online (Sandbox Code Playgroud)

小智 3

该库取决于 google-api-client。它有一个用于传输对象的自定义 json 解析器(如 GoogleCloudDialogflowV2WebhookRequest)。这些对象从地图延伸出来。它们的元素都标有 Key 注释。这就是普通的 jackson 或 gson 解析器失败的原因。您有多种选择:

  1. 复制并修改传输对象(如果将来 API 发生变化则不好)
  2. 为spring编写一个使用google api json解析器的httpmessageconverter(不知道这会花费多少精力)
  3. 禁用端点的 spring 消息转换器并自行进行编组,如下所示:

    import com.google.api.client.json.JsonGenerator;
    import com.google.api.client.json.jackson2.JacksonFactory;
    import com.google.api.services.dialogflow.v2.model.*;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RestController;
    import reactor.core.publisher.Mono;
    
    import java.io.IOException;
    import java.io.StringWriter;
    import java.util.Collections;
    
    @RestController
    public class DialogflowWebhookController {
    
    private static JacksonFactory jacksonFactory = JacksonFactory.getDefaultInstance();
    
    @PostMapping("/dialogflow")
    public Mono<String> webhook(@RequestBody String rawRequest) throws IOException {
    
        GoogleCloudDialogflowV2WebhookRequest request = jacksonFactory.createJsonParser(rawRequest)
            .parse(GoogleCloudDialogflowV2WebhookRequest.class);
    
        StringWriter stringWriter = new StringWriter();
        JsonGenerator jsonGenerator = jacksonFactory.createJsonGenerator(stringWriter);
        GoogleCloudDialogflowV2WebhookResponse response = ...
        jsonGenerator.serialize(response);
        jsonGenerator.flush();
        return Mono.just(stringWriter.toString());
    }
    }
    
    Run Code Online (Sandbox Code Playgroud)