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

POST请求触发JSON解析无内容映射错误,GET/DELETE正常,如何排查?

解决Spring POST请求JSON解析错误:输入结束无内容可映射

看起来你遇到的是Spring处理POST请求时的JSON解析问题,而且问题出在自定义的ParameterDeserializer上。我之前也踩过类似的坑,给你梳理几个最可能的原因和解决办法:

1. 自定义反序列化器未处理空输入

这个异常最常见的原因就是你的ParameterDeserializer在解析时,没有判断输入是否为空(比如请求体是空字符串、null,或者干脆没有请求体),直接硬解析就会抛出这个错误。

给你的反序列化器加个空判断逻辑就行:

@Override
public Parameter<T> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
    // 先检查是否有可读的JSON内容
    if (jsonParser.getCurrentToken() == null || jsonParser.getCurrentToken() == JsonToken.VALUE_NULL) {
        // 根据你的业务需求返回空对象或者null
        return new Parameter<>(); 
    }
    // 下面是你原来的解析逻辑
    // ...
}

2. POST请求的Content-Type没设置对

虽然GET和DELETE正常,但POST请求如果没带Content-Type: application/json这个请求头,Spring根本不会把请求体当作JSON来处理,反序列化器自然接不到有效内容。

不管是前端代码还是用Postman测试,都要确保请求头里包含这个字段。

3. 接口参数要求非空,但请求体为空

如果你的POST接口方法里,参数是@RequestBody Parameter<T>,默认是要求必须传请求体的。如果前端没传,Spring就会尝试把空内容反序列化成Parameter<T>,这时候没处理空情况的反序列化器就会报错。

如果你的业务允许请求体为空,可以给参数加上required = false:

@PostMapping("/your-api")
public ResponseEntity<?> handlePost(@RequestBody(required = false) Parameter<T> param) {
    // 你的业务逻辑
}

4. 泛型反序列化器的注册有问题

因为你的ParameterDeserializer是泛型类,要是注册的时候没指定具体的泛型类型,Jackson可能没法正确识别要解析的类型,遇到空输入就会炸。

注册的时候记得用TypeReference指定具体类型:

SimpleModule module = new SimpleModule();
// 比如针对Parameter<String>注册反序列化器
module.addDeserializer(new TypeReference<Parameter<String>>() {}, new ParameterDeserializer<String>());
objectMapper.registerModule(module);

先从第一个原因排查,这是最常见的情况,应该能解决你的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:50:27