Spring MVC Controller将请求对象添加到响应中

时间:2011-01-13 10:35:05

标签: json spring rest spring-mvc

我正在使用Spring 3.0.5构建JSON REST服务,而我的响应包含来自请求的对象,尽管我没有添加它。我使用 MappingJacksonJsonView 和Jackson 1.6.4将ModelAndView对象渲染为JSON。

User对象很简单

public class SimpleUser {
    private String username;
    private String password;

    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
    public String getPassword() { return password; }
    public void setPassword(String password) { this.password = password;
    }
}

其中一个请求看起来像这样

@RequestMapping(value = "/register", method = RequestMethod.GET)
public ModelAndView register(SimpleUser user) {
    ModelAndView mav = new ModelAndView();
    mav.addObject("ok", "success");
    return mav;
}

然后我用

调用服务
curl 'http://localhost:8080/register?username=mike&password=mike'

我期待的回应是

{"ok": "success"}

我得到的回应是

{"ok":"success","simpleUser":{"username":"mike","password":"mike"}}

将用户对象添加到ModelAndView的位置和原因以及如何防止这种情况?

可能的解决方案

解决此问题的一种方法是使用模型而不是 SimpleUser 。这似乎有效,但应该可以使用业务对象。

这有效:

@RequestMapping(value = "/register", method = RequestMethod.GET)
public ModelAndView register(Model model) {
    log.debug("register(%s,%s)", model.asMap().get("usernmae"), model.asMap().get("password"));
    ModelAndView mav = new ModelAndView();
    mav.addObject("ok", "success");
    return mav;
}

2 个答案:

答案 0 :(得分:3)

看起来您正在尝试处理表单提交并通过ajax检索结果。如果是这种情况,则不希望返回ModelAndView对象。使用@ResponseBody注释让Jackson将您的返回对象表示为json对象。

public @ResponseBody Map registerUser(SimpleUser user){
     Map responseMap = new HashMap();
     if(registerUser(user)){
          responseMap.put("OK", "Success");
     } else {
          responseMap.put("OK", "Failure");
     }
     return responseMap;
}

答案 1 :(得分:1)

对于 Spring 3.1.x 您可以在org.springframework.web.servlet.view.json中设置 modelKey 属性。 MappingJacksonJsonView in您的* servlet.xml如下所示:

Servlet.xml

<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
       <property name="modelKey" value="appResponse"/>
</bean>

请求方法:

@RequestMapping(value="/access") 
public @ResponseBody Model getAccess(Model model) {

  ...
  model.addAttribute("appResponse", responseDetails);
  ...

  return model;
}

当您设置特定的 modelKey 时,将忽略模型附加的所有其他属性,因此将显示表单参数/请求参数。此外,如果您要呈现多种媒体类型(application / xml或application / json)的视图,这将提供更清晰的设计。