记一次问题:@RequestBody “Content type ‘application/json;charset=UTF-8‘ not supported“

controller 伪代码如下:

@PostMapping("/rollback")
public AjaxResult rollback(@RequestBody Entity e) {
 	// 业务逻辑
   return AjaxResult.success("")
}

使用postman 请求之后,回执如下:

{
    "msg": "Content type 'application/json;charset=UTF-8' not supported",
    "code": 500
} 

报错大致如下:

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported
	at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:225)
	at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:158)
	at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:131)
	at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)
	at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:167)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
	……

当时我就知道,问题大了:因为长成这样的异常栈通常很难定位到问题。

一开始,我以为是请求url错误或者是postman的头设置的有问题,但一一检查之后,发现并没有错。

接着我怀疑是Entity 类有问题。

我立即更换了其他类来接收参数,我的怀疑是正确的:其他的类是好的,只有这个类会报错。
Entity伪代码如下:

@Data
@TableName("table")
public class Entity {
	private Long id;
	private Integer status;
	
	public void setStatus(Integer status) {
        this.status = status;
    }
    public void setStatus(StatusEnum status) {
        this.status = status.code;
    }
	public enum StatusEnum {
        NORMAL(0, "正常"),     
        ROLLED_BACK(1, "已回退"); 
        ……
    }
}

一开始,我怀疑是内部枚举类导致的JSON解析失败。

但是由于移除内部类需要改动的地方太多,

只能上手先测一下:

	@Test
    public void test(){
        String jStr = "{}";
        Entity e = JSON.parseObject(jStr , Entity .class);
        System.out.println(e);
    }

测试下来发现没有问题,Entity 与 json互转正常。

暂时没有思路的情况下,转而询问AI试图找到解决方案。

在AI一堆胡言乱语的各种建议之下,问题依旧没有得到解决。

在数次对话之后,AI给了一个很有用的建议:

AI: 最后,如果问题依然无法解决,可以考虑提供一个具体的错误信息或异常堆栈,这样可能更容易定位问题。

OK,因为之前的异常堆栈看起来实在很难搞定,导致我放弃了研究那些报错。

不过,这可是AI啊!

把异常堆栈post给AI之后,还真的很快就找到了原因:

从你提供的异常堆栈信息来看,@RequestBody注解使用失败的原因与HTTP请求的Content-Type有关,具体错误信息是Content type ‘application/json;charset=UTF-8’ not supported。这通常意味着Spring MVC无法找到合适的消息转换器来处理请求体中的JSON数据。

此外,还有一个与Jackson序列化相关的警告信息,提示status属性存在冲突的setter方法:
com.fasterxml.jackson.databind.JsonMappingException: Conflicting setter definitions for property "status": com.....Entity#setStatus(1 params) vs com.....Entity#setStatus(1 params)

真的是json转换的原因……

但是我测的时候用的并非jackson,所以顺利的通过了测试。

而jackson居然无法识别setter方法重载,在两个setStatus之间无法决定使用哪一个……

而这一个报错,藏在茫茫的异常栈中,真是无力吐槽……

知道错误之后,解决方法就很简单了:

	@JsonProperty
	public void setStatus(Integer status) {
        this.status = status;
    }
    public void setStatus(StatusEnum status) {
        this.status = status.code;
    }

从解决问题的过程中领悟到的就是,先将异常栈抛给AI。

一开始将 Content type 'application/json;charset=UTF-8' not supported 发给AI的时候AI给出的解决方案毫无作用。将异常栈给AI之后立即找出了问题——不是说这是万能的,但遇到问题的时候可以首先尝试一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值