You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Spring Boot以使用Klaxon库构建REST API

在Spring Boot中使用Klaxon构建REST API(完全替代Jackson)

我明白你要的是完全绕开Jackson,用Klaxon的JsonObject来处理动态请求体和响应体的需求,这就给你一步步捋清楚:

第一步:调整依赖,排除Jackson自动配置

Spring Boot默认会自动配置Jackson,所以我们得先把它排除掉,避免干扰。同时引入Klaxon的依赖:

如果用Maven,修改pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- 排除默认的Jackson自动配置 -->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- 引入Klaxon -->
<dependency>
    <groupId>com.beust</groupId>
    <artifactId>klaxon</artifactId>
    <version>5.5</version> <!-- 替换成最新稳定版即可 -->
</dependency>

如果用Gradle,修改build.gradle:

implementation('org.springframework.boot:spring-boot-starter-web') {
    exclude group: 'org.springframework.boot', module: 'spring-boot-starter-json'
}
implementation 'com.beust:klaxon:5.5'

第二步:自定义Klaxon消息转换器

接下来要写一个HttpMessageConverter的实现,让Spring Boot用Klaxon来序列化和反序列化JSON数据:

import com.beust.klaxon.Klaxon
import org.springframework.http.HttpInputMessage
import org.springframework.http.HttpOutputMessage
import org.springframework.http.MediaType
import org.springframework.http.converter.AbstractHttpMessageConverter
import org.springframework.http.converter.HttpMessageNotReadableException
import org.springframework.http.converter.HttpMessageNotWritableException
import java.io.IOException

class KlaxonHttpMessageConverter : AbstractHttpMessageConverter<Any>(MediaType.APPLICATION_JSON) {
    private val klaxon = Klaxon()

    override fun supports(clazz: Class<*>): Boolean {
        // 支持Klaxon的JsonObject、JsonArray等类型
        return clazz == com.beust.klaxon.JsonObject::class.java 
                || clazz == com.beust.klaxon.JsonArray::class.java
                || super.supports(clazz)
    }

    @Throws(HttpMessageNotReadableException::class, IOException::class)
    override fun readInternal(clazz: Class<out Any>, inputMessage: HttpInputMessage): Any {
        // 用Klaxon解析请求体为JsonObject
        return klaxon.parseJsonObject(inputMessage.body)
    }

    @Throws(HttpMessageNotWritableException::class, IOException::class)
    override fun writeInternal(t: Any, outputMessage: HttpOutputMessage) {
        // 把Klaxon的对象序列化为JSON输出
        when (t) {
            is com.beust.klaxon.JsonObject -> outputMessage.body.write(t.toJsonString().toByteArray())
            is com.beust.klaxon.JsonArray<*> -> outputMessage.body.write(t.toJsonString().toByteArray())
            else -> throw IllegalArgumentException("Unsupported type for Klaxon serialization: ${t::class.java}")
        }
    }
}

然后把这个转换器注册到Spring容器里,替换默认的转换器:

import org.springframework.context.annotation.Configuration
import org.springframework.http.converter.HttpMessageConverter
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer

@Configuration
class WebConfig : WebMvcConfigurer {
    override fun configureMessageConverters(converters: MutableList<HttpMessageConverter<*>>) {
        // 清空默认转换器,添加我们的Klaxon转换器
        converters.clear()
        converters.add(KlaxonHttpMessageConverter())
    }
}

第三步:编写你的控制器

现在就可以用Klaxon的JsonObject来接收请求体,处理后再返回了,修正你给的示例代码:

import com.beust.klaxon.JsonObject
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RestController

@RestController
class SampleController {

    @PostMapping("/test")
    fun test(@RequestBody body: JsonObject): JsonObject {
        // 用Klaxon的低级API处理动态数据,比如灵活获取字段
        val username = body.string("username")
        val age = body.int("age")

        // 构建返回的JsonObject
        val response = JsonObject(mapOf(
            "status" to "success",
            "receivedUsername" to username,
            "receivedAge" to age,
            "originalRequest" to body
        ))

        return response
    }
}

关键要点解释

  • 为什么排除Jackson?:因为你明确要求不用Jackson处理请求/响应体,排除spring-boot-starter-json就能阻止Spring自动配置Jackson的消息转换器,避免冲突。
  • 为什么用低级API?:对于动态JSON数据,Klaxon的JsonObject/JsonArray就是专门的低级API,能灵活处理不确定结构的数据,不用绑定到具体的Kotlin数据类,完全符合你的需求。
  • 消息转换器的作用:Spring通过HttpMessageConverter来处理请求体的解析和响应体的序列化,我们自定义的转换器告诉Spring用Klaxon来完成这些工作。

内容的提问来源于stack exchange,提问作者nail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:33:05