gofor's blog

  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

spring boot custom HttpMessageConverter with kotlin

发表于 2017-04-13 更新于 2020-01-10 分类于 技术 阅读次数: Valine:
Make everything as simple as possible, but not simpler. --- Albert Einstein

在 Spring Boot 开发过程中,有时候需要自定义数据类型,而默认的 HttpMessageConverter 不能将自定义数据类型序列化为想要的数据,因此需要自定义序列化与反序列化。Gson 或 Jackson 实现

自定义类型为 CustomType 。

Gson 实现,继承 GsonHttpMessageConverter 类,并实现 JsonSerializer 和 JsonDeserializer 接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class CustomGsonHttpMessageConverter : GsonHttpMessageConverter() {
init {
//自定义Gson转换器
super.setGson(GsonBuilder()
.serializeNulls() //null值属性也需要序列化(添加此项可将实体类中为空的数据序列化到json中,其值为null
//注册到Gson的类型适配器
.registerTypeAdapter(CustomType::class.java, CustomTypeConverterAdapter())
.create())
}

//----------JsonSerializer-------JsonDeserializer------

//自定义CustomType序列化与反序列化
inner class CustomTypeConverterAdapter : JsonSerializer<CustomType>, JsonDeserializer<CustomType> {
override fun serialize(src: CustomType?, typeOfSrc: Type, context: JsonSerializationContext): JsonElement
= if (src == null) JsonPrimitive("") else JsonPrimitive(src.toString())

override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): CustomType
= CustomType(json.asJsonPrimitive.asString)
}

}

Jackson 实现,继承 MappingJackson2HttpMessageConverter 类,分别继承抽象类 JsonSerializer 和 JsonDeserializer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class CustomJackson2HttpMessageConverter : MappingJackson2HttpMessageConverter() {

init {
super.setObjectMapper(
Jackson2ObjectMapperBuilder()
//通过自定义类型注册到ObjectMapper
.deserializerByType(CustomType::class.java, CustomTypeDeserialize())
.serializerByType(CustomType::class.java, CustomTypeSerialize())
.serializationInclusion(JsonInclude.Include.NON_NULL)
.build()
)
}

inner class CustomTypeDeserialize : JsonDeserializer<tag_t>() {
override fun deserialize(parser: JsonParser?, context: DeserializationContext?): CustomType
= CustomType(parser?.text ?: "")
}

inner class CustomTypeSerialize : JsonSerializer<tag_t>() {
override fun serialize(value: CustomType?, generator: JsonGenerator?, provider: SerializerProvider?) {
generator?.writeString(value?.toString() ?: "")
}
}

}

最后通过 WebConfig 配置消息转换器

1
2
3
4
5
6
7
8
9
10
11
@Configuration
open class WebConfig : WebMvcConfigurerAdapter() {

override fun configureMessageConverters(converters: MutableList<HttpMessageConverter<*>>) {
//注册多个HttpMessageConverter(按顺序调用)
converters.add(CustomGsonHttpMessageConverter())
converters.add(CustomJackson2HttpMessageConverter())
super.configureMessageConverters(converters)
}

}

以上通过 Java Configure 的方式配置,也可通过在 application.yml 文件中配置相关数据。

  • 本文作者: gofor
  • 本文链接: https://acehjm.github.io/2017/04/13/spring-boot-custom-HttpMessageConverter-with-kotlin/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
# kotlin # java
Kotlin & Spring boot 使用@Valid校验无效解决方法
技术类相关概念整理
gofor

gofor

Programming technology
14 日志
4 分类
14 标签
RSS
GitHub StackOverflow
Creative Commons
© 2016 – 2020 gofor
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Pisces v7.3.0
0%