ClickHouseArray序列化異常

1.異常

Caused by: com.fasterxml.jackson.databind.JsonMappingException: (was java.sql.SQLFeatureNotSupportedException) (through reference chain: com.****.HttpResult["content"]->java.util.ArrayList[0]->java.util.LinkedHashMap["column_14"]->ru.yandex.clickhouse.ClickHouseArray["resultSet"])

使用jdbc操作clickhouse執行sql的返回結果時報錯

2、項目中其他語句都沒有報錯,只有在返回 ClickHouseArray 這個類的時候序列化異常。沒有看到其他解法,就自己實現序列化和反序列的代碼。

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

/**
 * Description 系統配置
 * Date 2020/9/9 18:02
 *
 * @author by mays
 */
@Slf4j
@Configuration
public class SystemConfig implements WebMvcConfigurer {

    @Bean
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
        jsonConverter.setObjectMapper(ObjectMapperFactory.getDefaultObjectMapper());
        return jsonConverter;
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(mappingJackson2HttpMessageConverter());
    }

}
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import ru.yandex.clickhouse.ClickHouseArray;

import java.text.SimpleDateFormat;

public class ObjectMapperFactory {

    private static final ObjectMapper OBJECT_MAPPER;


  static {
    OBJECT_MAPPER = new ObjectMapper();
    OBJECT_MAPPER.disable(
            //忽略未知屬性 防止解析報錯
            DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
            //解決空屬性報錯
            .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)
            .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
            .disable(SerializationFeature.WRITE_NULL_MAP_VALUES)
            .configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true)
            .configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true)
            .configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);

    OBJECT_MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);

    OBJECT_MAPPER.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

    // 全局clickHouseArray序列化配置
    SimpleModule module = new SimpleModule();
    module.addSerializer(ClickHouseArray.class, new ClickHouseArraySerialize());

    OBJECT_MAPPER.registerModule(module);
    OBJECT_MAPPER.findAndRegisterModules();
  }

  public static ObjectMapper getDefaultObjectMapper() {
    return OBJECT_MAPPER;
  }

}
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import lombok.SneakyThrows;
import ru.yandex.clickhouse.ClickHouseArray;

import java.io.IOException;

/**
 * click house 序列化
 */
public class ClickHouseArraySerialize extends JsonSerializer<ClickHouseArray> {

    @SneakyThrows
    @Override
    public void serialize(ClickHouseArray clickHouseArray, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        // 對象轉爲字節流
        jsonGenerator.writeStartObject();
        jsonGenerator.writeStringField("elementType", clickHouseArray.getBaseTypeName());
        jsonGenerator.writeObjectField("array", clickHouseArray.getArray());
        jsonGenerator.writeEndObject();
    }
}
<!--click house OLAP數據庫-->
        <dependency>
            <groupId>ru.yandex.clickhouse</groupId>
            <artifactId>clickhouse-jdbc</artifactId>
            <version>0.3.1</version>
        </dependency>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章