美文网首页
Spring cloud feign序列表LocalDateTi

Spring cloud feign序列表LocalDateTi

作者: Anson_1f2a | 来源:发表于2020-08-19 11:10 被阅读0次

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。

  • jackson
    首次尝试时,处理返回的String类型报错,然后就换gson了。
<dependency>
      <groupId>io.github.openfeign</groupId>
      <artifactId>feign-jackson</artifactId>
      <version>11.0</version>
</dependency>
  • gson
    由于项目里使用了gson,所以选择这个。
<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))
        }
    }
}

相关文章

网友评论

      本文标题:Spring cloud feign序列表LocalDateTi

      本文链接:https://www.haomeiwen.com/subject/ecjrjktx.html