我正在使用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;
}
答案 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)的视图,这将提供更清晰的设计。