From 2631352c30019b9051f6e289c1ea93ae87fb73f3 Mon Sep 17 00:00:00 2001 From: LXW <1264174498@qq.com> Date: Wed, 20 Dec 2023 22:11:36 +0800 Subject: [PATCH] (improvement)(common) Add JsonUtil configuration to avoid deserialization failure when enumeration values change (#558) Co-authored-by: jolunoluo --- .../query/plugin/PluginSemanticQuery.java | 38 +++++++++---------- .../query/plugin/webpage/WebPageQuery.java | 10 ----- .../plugin/webservice/WebServiceQuery.java | 12 ++---- .../supersonic/common/util/JsonUtil.java | 16 +++++--- 4 files changed, 33 insertions(+), 43 deletions(-) diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/PluginSemanticQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/PluginSemanticQuery.java index 19a35a4cc..39a827f56 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/PluginSemanticQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/PluginSemanticQuery.java @@ -9,11 +9,11 @@ import com.tencent.supersonic.chat.api.pojo.request.QueryFilters; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.chat.plugin.PluginParseResult; import com.tencent.supersonic.chat.query.BaseSemanticQuery; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; import java.util.HashMap; import java.util.List; import java.util.Map; -import lombok.extern.slf4j.Slf4j; -import org.springframework.util.CollectionUtils; @Slf4j public abstract class PluginSemanticQuery extends BaseSemanticQuery { @@ -50,25 +50,24 @@ public abstract class PluginSemanticQuery extends BaseSemanticQuery { Map filterValueMap = getFilterMap(pluginParseResult); List schemaElementMatchList = parseInfo.getElementMatches(); if (!CollectionUtils.isEmpty(schemaElementMatchList)) { - schemaElementMatchList.stream() - .filter(schemaElementMatch -> + schemaElementMatchList.stream().filter(schemaElementMatch -> SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType()) || SchemaElementType.ID.equals(schemaElementMatch.getElement().getType())) - .filter(schemaElementMatch -> schemaElementMatch.getSimilarity() == 1.0) - .forEach(schemaElementMatch -> { - Object queryFilterValue = filterValueMap.get(schemaElementMatch.getElement().getId()); - if (queryFilterValue != null) { - if (String.valueOf(queryFilterValue).equals(String.valueOf(schemaElementMatch.getWord()))) { - elementValueMap.put( - String.valueOf(schemaElementMatch.getElement().getId()), - schemaElementMatch.getWord()); + .filter(schemaElementMatch -> schemaElementMatch.getSimilarity() == 1.0) + .forEach(schemaElementMatch -> { + Object queryFilterValue = filterValueMap.get(schemaElementMatch.getElement().getId()); + if (queryFilterValue != null) { + if (String.valueOf(queryFilterValue).equals(String.valueOf(schemaElementMatch.getWord()))) { + elementValueMap.put( + String.valueOf(schemaElementMatch.getElement().getId()), + schemaElementMatch.getWord()); + } + } else { + elementValueMap.computeIfAbsent( + String.valueOf(schemaElementMatch.getElement().getId()), + k -> schemaElementMatch.getWord()); } - } else { - elementValueMap.computeIfAbsent( - String.valueOf(schemaElementMatch.getElement().getId()), - k -> schemaElementMatch.getWord()); - } - }); + }); } return elementValueMap; } @@ -81,7 +80,7 @@ public abstract class PluginSemanticQuery extends BaseSemanticQuery { if (!CollectionUtils.isEmpty(webPage.getParamOptions()) && !CollectionUtils.isEmpty(elementValueMap)) { for (ParamOption paramOption : webPage.getParamOptions()) { if (paramOption.getModelId() != null - && !parseInfo.getModel().getModelIds().contains(paramOption.getModelId())) { + && !parseInfo.getModel().getModelIds().contains(paramOption.getModelId())) { continue; } paramOptions.add(paramOption); @@ -96,4 +95,5 @@ public abstract class PluginSemanticQuery extends BaseSemanticQuery { webBaseResult.setParamOptions(paramOptions); return webBaseResult; } + } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageQuery.java index 1ee5b271e..a8df818a6 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageQuery.java @@ -1,28 +1,18 @@ package com.tencent.supersonic.chat.query.plugin.webpage; -import com.google.common.collect.Lists; import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; -import com.tencent.supersonic.chat.api.pojo.SchemaElementType; -import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; -import com.tencent.supersonic.chat.api.pojo.request.QueryFilters; -import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; import com.tencent.supersonic.chat.api.pojo.response.QueryState; import com.tencent.supersonic.chat.plugin.Plugin; import com.tencent.supersonic.chat.plugin.PluginParseResult; import com.tencent.supersonic.chat.query.QueryManager; -import com.tencent.supersonic.chat.query.plugin.ParamOption; import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery; import com.tencent.supersonic.chat.query.plugin.WebBase; import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.common.util.JsonUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; -import java.util.HashMap; -import java.util.List; import java.util.Map; @Slf4j diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webservice/WebServiceQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webservice/WebServiceQuery.java index cbabfa9c0..ca5be8ffc 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webservice/WebServiceQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webservice/WebServiceQuery.java @@ -1,7 +1,6 @@ package com.tencent.supersonic.chat.query.plugin.webservice; import com.alibaba.fastjson.JSON; -import com.google.common.collect.Lists; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; import com.tencent.supersonic.chat.api.pojo.response.QueryState; @@ -13,12 +12,8 @@ import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery; import com.tencent.supersonic.chat.query.plugin.WebBase; import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.common.pojo.QueryColumn; -import com.tencent.supersonic.common.util.JsonUtil; import com.tencent.supersonic.common.util.ContextUtils; - -import java.net.URI; -import java.util.List; -import java.util.Map; +import com.tencent.supersonic.common.util.JsonUtil; import lombok.extern.slf4j.Slf4j; import org.apache.calcite.sql.parser.SqlParseException; import org.springframework.http.HttpEntity; @@ -27,11 +22,12 @@ import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; - +import java.net.URI; import java.util.HashMap; +import java.util.List; +import java.util.Map; @Slf4j diff --git a/common/src/main/java/com/tencent/supersonic/common/util/JsonUtil.java b/common/src/main/java/com/tencent/supersonic/common/util/JsonUtil.java index 50eb06b36..7b500c1ee 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/JsonUtil.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/JsonUtil.java @@ -12,6 +12,12 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.type.CollectionType; import com.fasterxml.jackson.databind.type.MapType; import com.fasterxml.jackson.databind.type.TypeFactory; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + import java.io.IOException; import java.nio.charset.Charset; import java.security.InvalidParameterException; @@ -20,12 +26,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import lombok.Getter; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; - @Slf4j public class JsonUtil { @@ -41,6 +41,10 @@ public class JsonUtil { objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); //允许使用未带引号的字段名 objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); + //忽略未知enum字段,置为null + objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true); + //反序列化忽略未知字段 + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //允许使用单引号 objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); // 遇到空对象不抛异常