1. 兼容问题
OpenFeign与WebFlux不兼容,会报异常错误。如果需要使用,则需提供Encoder
和Decoder
。
[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))
}
}
}
网友评论