Spring Boot没有使用Jackson Kotlin插件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot没有使用Jackson Kotlin插件相关的知识,希望对你有一定的参考价值。
我不能强迫Spring为Jackson使用Kotlin模块。问题是Jackson无法将JSON解析为数据类。
//Exception
2018-02-23 13:29:09.046 ERROR 24730 --- [nio-9300-exec-1] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/services] threw exception [Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [*.model.User]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: Parameter specified as non-null is null: method *.model.User.<init>, parameter name] with root cause
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method *.User.<init>, parameter name
//JSON
{
"name": "name",
"surname": "surname",
"email": "email",
"password": "pswd"
}
//Model
@Entity
@Table
data class User(
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
var userId: Long?,
var name: String,
var surname: String,
var email: String,
var password: String,
(...)
): Resource() {
(...)
}
我试图配置杰克逊,但它没有多大帮助。有什么奇怪的,在我配置ObjectMapper的@Bean方法中,一切正常。此外,当我为非可空字段添加默认值时,它们不会被覆盖。
@Configuration
class JacksonConfig {
@Bean
fun mappingJackson2HttpMessageConverter(): MappingJackson2HttpMessageConverter {
val mapper = ObjectMapper().registerKotlinModule()
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
var user = mapper.readValue<User>("{
" +
" "name": "name",
" +
" "surname": "surname",
" +
" "email": "email",
" +
" "password": "pswd"
" +
"}")
return MappingJackson2HttpMessageConverter(mapper)
}
}
可能重要的是模型与应用程序本身在不同的项目中。
Kotlin版本是1.20杰克逊依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version> <!--2.9.4-->
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-kotlin</artifactId>
<version>${jackson.version}</version>
</dependency>
我现在尝试的是:
Similiar problem but probably different case anyway
还有一些其他的,不值得注意的。
答案
我是愚蠢的,认真的。
我的结构如下:
abstract class AbstractController (...) {
fun save(@RequestMapping entity: T) {
(...)
}
并启用它我用过
class DeriveredController (...) {
@PostMapping
override fun save(entity: Derivered) {
(...)
}
}
问题在于派生函数中缺少@RequestMapping。
以上是关于Spring Boot没有使用Jackson Kotlin插件的主要内容,如果未能解决你的问题,请参考以下文章
使用 Gson/Jackson 和 Spring Boot 重新创建没有字段属性的 DTO 类,而不是使其为空
在 Spring Boot 中使用 Jackson 反序列化 Date 对象
Spring boot + Jackson - 始终将日期转换为 UTC
spring boot定制Jackson ObjectMapper,为什么不生效
Spring boot Jackson Json Serialization for List 实现类(PagedList)