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之后立即找出了问题——不是说这是万能的,但遇到问题的时候可以首先尝试一下。
2万+

被折叠的 条评论
为什么被折叠?



