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>