Spring MVC @ResponseBody问题

时间:2015-02-03 04:48:49

标签: java spring spring-mvc

我只是学习了几天的春天mvc,并且我写了一些代码:

@RequestMapping(value = "/login", method = {RequestMethod.POST, RequestMethod.GET}, consumes = "*/*", produces = "application/json")
@ResponseBody
public  Object userLogin(@RequestParam(value = "userName") String userName,@RequestParam(value = "password") String password) {

    String password2 = userService.selectUserPassword(userName);

    JSONObject object = new JSONObject();
    if(password2.equals(password)){
        object.put("login", "true");
    }else{
        object.put("login", "false");
    }
    return object;  

}

它不起作用,但如果我将代码更改为

public  Map<String, String> userLogin(@RequestParam(value = "userName") String userName,
        @RequestParam(value = "password") String password) {

    String password2 = userService.selectUserPassword(userName);

    Map<String, String> map = new HashMap<String, String>(1);
    //JSONObject object = new JSONObject();
    if(password2.equals(password)){
        map.put("login", "true");
    }else{
        map.put("login", "false");
    }
    return map; 

}

然后它的工作原理。所以我想知道为什么?

1 个答案:

答案 0 :(得分:1)

要了解两种方法之间的差异,请注意以下内容

  • @ResponseBody注释表示返回类型被写入响应正文。

  • Spring使用适当的HttpMessageConverter

  • 将返回的对象转换为响应正文
  • 由于您已指出produces = "application/json"将启动的转换器为MappingJackson2HttpMessageConverter 可以使用Jackson的ObjectMapper读取和写入JSON的HttpMessageConverter实现

这是Spring MVC自动执行的强大功能,它解析表示并自动转换。

在您的第一种方法中,您尝试手动执行此操作,这不是必需的,也是错误的。该框架尝试将您的JsonObject转换为JSON表示,该表示失败或为您提供包含JsonObject类的文件的JSON属性。

在后面的方法中,您将值弹出到Map,然后让Spring MVC转换为JSON。由于Jackson库知道如何将Map转换为JSON,因此后一种方法可以正常运行