春季MVC@ResponseBody问题



我只是学习了几天的春季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; 
}

然后它起作用了。所以我想知道为什么?

要了解这两种方法之间的差异,请注意以下事项

  • @ResponseBody批注指示返回类型已写入响应正文。

  • Spring 通过使用适当的 HttpMessageConverter 将返回的对象转换为响应正文

  • 由于您已经指出了produces = "application/json"将启动的转换器是MappingJackson2HttpMessageConverter,因此可以使用Jackson的ObjectMapper读取和写入JSON的HttpMessageConverter实现。

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

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

在后面的方法中,您将值弹出到一个 Map,并让 Spring MVC 转换为 JSON。由于杰克逊库知道如何将地图转换为 JSON,因此您以后的方法可以毫无问题地工作

最新更新