1.修改Jackson序列化JAVA8时间的问题
val objectMapper: ObjectMapper = ObjectMapper()
val javaTimeModule = JavaTimeModule()
javaTimeModule.addSerializer(LocalDate::class.java, LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
javaTimeModule.addSerializer(LocalTime::class.java, LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")))
javaTimeModule.addSerializer(LocalDateTime::class.java, LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
javaTimeModule.addDeserializer(LocalDate::class.java, LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
javaTimeModule.addDeserializer(LocalTime::class.java, LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")))
javaTimeModule.addDeserializer(LocalDateTime::class.java, LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
objectMapper.registerModule(javaTimeModule)
2.objectMapper.readValue(json)出现错误
//引入jackson-module-kotlin
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-kotlin</artifactId>
<version>2.11.0</version>
</dependency>
//配置ObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
objectMapper.registerModule(KotlinModule())
//此刻在使用readValue方法便不会报错,由于类型推断,所以不用像JAVA一样定义TypeReference来做转换
objectMapper.readValue(json)
//java此刻写法
objectMapper.readValue(json, new TypeReference<List<LocalTime>>(){})
3.JacksonXml遇到问题
@JacksonXmlRootElement(localName = "Attack_Pattern_Catalog")
data class AttackPatterns(
/**
* 反序列化时会出现Jackson Could not find creator property with name “Attack_Pattern”,
* 这个问题是Jackson-module-kotlin的Bug导致的,官方已列为BUG,但是还未修复,问题连接
* 参见https://github.com/FasterXML/jackson-module-kotlin/issues/153
*/
@JacksonXmlElementWrapper(localName = "Attack_Patterns", useWrapping = false)
@JacksonXmlProperty(localName = "Attack_Pattern")
var attackPatterns: List<AttackPattern> = listOf()
在官方解决BUG前的解决方案如下
//目前将上面的数据类写法改成这样,便可以解决问题
@JacksonXmlRootElement(localName = "Attack_Pattern_Catalog"
data class AttackPatterns(
private var _attackPatterns: List<AttackPattern> = listOf(
) {
@get:JacksonXmlElementWrapper(localName = "Attack_Patterns", useWrapping = false)
@get:JacksonXmlProperty(localName = "Attack_Pattern")
var attackPatterns
set(value) { _attackPatterns= value }
get() = _attackPatterns
}
4.Jackson XML反序列化遇到Expected END_ELEMENT, got event of type 1
/**
* 使用spring boot2.4.7的时候,反序列化XML出现了Expected END_ELEMENT, got event of type 1
* 的错误,查阅了很多资料都找不到解决方法,最后在Github的jackson-module-kotlin的ISSUES中
* 看到有人评论说换到2.12.1就可以,https://github.com/FasterXML/jackson-module-kotlin/issues/203
*/
<dependency>
<artifactId>jackson-databind</artifactId>
<groupId>com.fasterxml.jackson.core</groupId>
<version>2.12.1</version>
</dependency>
//全局替换Jackson版本
<jackson-bom.version>2.12.3</jackson-bom.version>
``