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
相关产品推荐
相关产品推荐

