2011-01-13 8 views
3

Я строй службы JSON REST с Spring 3.0.5 и мой ответа содержит объект из моего запроса хотя я не добавлял его. Я использую MappingJacksonJsonView и Jackson 1.6.4 для рендеринга объекта ModelAndView для JSON.Spring MVC контроллер добавляет объект запроса ответ

Объект Пользователь просто

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; 
} 

ответ

3

Похоже, вы пытаетесь обработать данные формы и получить результат через 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; 
} 
+0

Здравствуйте, @EndlessLoop, я также сталкиваюсь с той же проблемой, но я использую 'ContentNegotiationViewResolver' с' XStreamMarshller'.Нажмите на следующую ссылку, чтобы увидеть мою проблему: http://stackoverflow.com/questions/25037473/spring-mvc-modelandviewcontainer-view-is-null-default-modelsome-object –

1

Для Spring 3.1.x Вы можете установить modelKey недвижимость в org.springframework.web.servlet.view.json. 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, все остальные атрибуты, приложенные к модели, будут игнорироваться, следовательно, параметры формы/req uest параметры. В дополнение, это обеспечивает более четкий дизайн, если вы представляете представления для нескольких типов медиа (application/xml или application/json).

+0

Здравствуйте, @MasterV, я также сталкиваюсь с той же проблемой, но я использую 'ContentNegotiationViewResolver' с' XStreamMarshller'. Нажмите на следующую ссылку, чтобы увидеть мою проблему: http://stackoverflow.com/questions/25037473/spring-mvc-modelandviewcontainer-view-is-null-default-modelsome-object –