如题,最近在搭建一个SSM+Maven框架,在Controller层加上@ResponseBody注解时,返回的类型转换成JSON对象会出错,前端请求的ajax不能够进入到success下 情况如下:
$.ajax({
cache: true,
type: "POST",
url:"login",
data: {
user_name : $("#user_name").val(),
user_pwd : CryptoJS.MD5($("#user_pwd").val()).toString(),
},
async: false,
success: function(data){
alert(data);
if(data.success)
{
alert(data);
$("#loginYes").submit();
}else
{
$.messager.alert('提示',data.msg);
$("#passWord").val("") ;
}
},
error : function(r){
$.messager.alert('提示',"系统忙,请稍后再试!");
}
});
@ResponseBody
@RequestMapping("/login")
public Map login(Model model,HttpServletRequest request,HttpServletResponse response,HttpSession session,User param) {
Map m = new HashMap();
/*String rand = "" + session.getAttribute("rand");*/
/*if(rand.equals(param.getRand())) {*/
User user = iUserService.existUser(param);
boolean exist = user==null ? false : true;
if(exist) {
if(user.getRole_id() == null) {
m.put("success", false);
m.put("msg", "用户尚未分配权限,请联系系统管理员!");
return m;
}else {
//获取角色信息
Role role = new Role();
role.setId(Integer.parseInt(user.getRole_id()));
role = iRoleService.getOneById(role);
session.setAttribute("role", role);
//获取用户权限
List auths = iUserService.getUserAction(user);
if(auths.size() == 0) {
m.put("success", false);
m.put("msg", "用户尚未分配权限,请联系系统管理员!");
return m;
}
session.setAttribute("user", user);
session.setAttribute("auth", auths);
//获取用户菜单目录
List
运行后,ajax可以访问controller方法,但是返回的json数据后,ajax的success接收不到,提示的错误是:
java.lang.IllegalArgumentException: No converter found for return value of type: class java.util.HashMap
在使用@ResponseBody注解时,controller方法中返回的数据会自动转化为json格式的数据,但是出现如上错误因此可以猜测为,返回值转成json类型数据错误可能是配置错误或json包错误。
解决方法: 由于我的是Maven构建的项目
在pom.xml中加入
com.fasterxml.jackson.core
jackson-databind
2.8.8
com.fasterxml.jackson.core
jackson-core
2.8.8
com.fasterxml.jackson.core
jackson-annotations
2.8.8
net.sf.json-lib
json-lib
2.4
jdk15
然后通过Maven->update project ,重新运行项目就可以了。
1、@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
2、@RequestMapping("/login")
@ResponseBody
public User login(User user){
return user;
}
User字段:userName pwd
那么在前台接收到的数据为:'{"userName":"xxx","pwd":"xxx"}'
效果等同于如下代码:
@RequestMapping("/login")
public void login(User user, HttpServletResponse response){
response.getWriter.write(JSONObject.fromObject(user).toString());
}