Spring cloud feign序列表LocalDateTi

2020-08-19  本文已影响0人  Anson_1f2a

1. 兼容问题

OpenFeign与WebFlux不兼容,会报异常错误。如果需要使用,则需提供EncoderDecoder
[1] reference

feign.codec.DecodeException: No qualifying bean of type 'org.springframework.boot.autoconfigure.http.HttpMessageConverters' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

解决方案

加入依赖。目前有两个选择:jackson和gson。

<dependency>
      <groupId>io.github.openfeign</groupId>
      <artifactId>feign-jackson</artifactId>
      <version>11.0</version>
</dependency>
<dependency>
      <groupId>io.github.openfeign</groupId>
      <artifactId>feign-gson</artifactId>
      <version>11.0</version>
</dependency>

2. 反序列LocalDateTime出现异常

feign.codec.DecodeException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING

查找了很多资料,然后自己写了个配置类。

import com.google.gson.*
import feign.codec.Decoder
import feign.codec.Encoder
import feign.gson.GsonDecoder
import feign.gson.GsonEncoder
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import java.lang.reflect.Type
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

/**
 * @author Anson
 * @date 2020/8/19
 */
@Configuration
class FeignConfiguration {
    private val gson = GsonBuilder()
            .registerTypeAdapter(LocalDateTime::class.java, LocalDateTimeDeserializer())
            .registerTypeAdapter(LocalDateTime::class.java, LocalDateTimeSerializer())
            .create()
    // 反序列化
    @Bean
    fun decoder(): Decoder {
        return GsonDecoder(gson)
    }
    // 序列化
    @Bean
    fun encoder(): Encoder {
        return GsonEncoder(gson)
    }
    // 时间反序列化
    class LocalDateTimeDeserializer : JsonDeserializer<LocalDateTime> {
        override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): LocalDateTime {
            return LocalDateTime.parse(json.asString, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS"))
        }
    }
    // 时间序列化
    class LocalDateTimeSerializer : JsonSerializer<LocalDateTime> {
        override fun serialize(localDateTime: LocalDateTime, typeOfT: Type, context: JsonSerializationContext): JsonElement {
            val format = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS")
            return JsonPrimitive(format.format(localDateTime))
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读