Spring MVC Controller добавляет объект запроса в ответ - PullRequest
3 голосов
/ 13 января 2011

Я создаю службу JSON REST с Spring 3.0.5, и мой ответ содержит объект из моего запроса , хотя я его не добавил. Я использую 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 ]

3 голосов
/ 14 января 2011

Похоже, вы пытаетесь обработать отправку формы и получить результат через ajax. Если это так, вы не хотите возвращать объект ModelAndView. Используйте аннотацию @ResponseBody, чтобы Джексон представлял ваш возвращаемый объект как объект 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 голос
/ 16 ноября 2012

Для Spring 3.1.x Вы можете установить свойство modelKey в org.springframework.web.servlet.view.json. MappingJacksonJsonView в вашем * сервлете.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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...