SpringMVC返回对象类型报错(已解决)
错误描述
在使用ajax接收后端返回值时,遇到这样一个问题
1、刚开始接收返回值时,代码报错500,我没去查看报错详情,直接去看后端代码。
2、我将后端返回类型更改之后,ajax返回200成功,却进入error函数,百思不得其解。
后查阅资料发现是我返回的json格式不对,jQuery在1.4后,对ajax返回的json格式有了很强的限制,所以一定要用严格的JSON格式返回。但是在后端强制转换map为Json时,还是会直接进入error。
JSONObject jsonObject = new JSONObject(ret);
前端代码修改
var data = $("#form").serialize();
$.ajax({
type: "post",
url: "login",
data: data,
dataType: "json", //返回数据类型
success: function(data){
if("success" == data.type){
window.location.href = "index";
} else{
$.messager.alert("消息提醒", data.msg, "warning");
$("#vcodeImg").click();//切换验证码
$("input[name='vcode']").val("");//清空验证码输入框
}
},
error: function (XMLHttpResponse, textStatus, errorThrown) {
console.log("1 异步调用返回失败,XMLHttpResponse.readyState:"+XMLHttpResponse.readyState);
console.log("2 异步调用返回失败,XMLHttpResponse.status:"+XMLHttpResponse.status);
console.log("3 异步调用返回失败,textStatus:"+textStatus);
console.log("4 异步调用返回失败,errorThrown:"+errorThrown);
}
error报错
1 异步调用返回失败,XMLHttpResponse.readyState:4
2 异步调用返回失败,XMLHttpResponse.status:500
3 异步调用返回失败,textStatus:error
4 异步调用返回失败,errorThrown:
这时候觉得会不会是我的依赖包没有配置好,导致springmvc无法将对象直接转换为json对象。因此查看了错误信息后。
报错如下:
org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class java.util.HashMap
org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:233)
org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:180)
org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:82)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:119)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)
javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
确定了是自己缺少了两个依赖包,因此
在pom.xml中添加如下代码:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.5</version>
</dependency>
修改你的mvc-servlet.xml
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
至此,所有问题得到解决,果然老师说的没有错,MVC框架写代码不难,难就难在配置变量,以此为戒。
感谢两位大佬提供的解决思路
链接: https://blog.csdn.net/java_zhangshuai.
链接: https://blog.csdn.net/feinifi.