【问题标题】:Spring MVC Controller adds request object to responseSpring MVC Controller 将请求对象添加到响应中
【发布时间】:2011-06-08 10:08:56
【问题描述】:

我正在使用 Spring 3.0.5 构建 JSON REST 服务,并且我的 response 包含来自我的 request 的对象,尽管我没有添加它。我正在使用 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 的位置和原因以及如何防止这种情况发生?

可能的解决方案

解决此问题的一种方法是使用 Model 而不是 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;
}

【问题讨论】:

    标签: json spring rest spring-mvc


    【解决方案1】:

    您似乎正在尝试处理表单提交并通过 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;
    }
    

    【讨论】:

    【解决方案2】:

    对于 Spring 3.1.x 可以在 org.springframework.web.servlet.view.json 中设置 modelKey 属性。MappingJacksonJsonView 中您的 *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)的视图,这将提供更清晰的设计。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多