Как остановить неявное обогащение модели с помощью командного объекта в обработчиках Spring при отправке в View? - PullRequest
1 голос
/ 21 апреля 2011

если вы посмотрите на возвращаемые типы обработчиков , все это говорит о том, что модель обогащается командой commandObject до того, как она попадает в представление.

Как остановить это?Я хочу возвращать только те данные, которые я установил в обработчике, чтобы попасть в View, а не commandObject, который был передан в обработчик.

    Map map = new HashMap();
    map.put("sucess", "sucess");
    return new ModelAndView("ajaxResponse", map);

Это потому, что обработка Spring AnnotationMethodHandlerAdapter объединяется для каждого возвращаемого типа.

if (returnValue instanceof ModelAndView) {
    ModelAndView mav = (ModelAndView) returnValue;
    mav.getModelMap().mergeAttributes(implicitModel);
    return mav;
}
else if (returnValue instanceof Model) {
    return new ModelAndView().addAllObjects(implicitModel).addAllObjects(((Model) returnValue).asMap());
}
else if (returnValue instanceof View) {
    return new ModelAndView(returnValue).addAllObjects(implicitModel);
}
else if (handlerMethod.isAnnotationPresent(ModelAttribute.class)) {
    addReturnValueAsModelAttribute(handlerMethod, handlerType, returnValue, implicitModel);
    return new ModelAndView().addAllObjects(implicitModel);
}
else if (returnValue instanceof Map) {
    return new ModelAndView().addAllObjects(implicitModel).addAllObjects((Map) returnValue);
    }
else if (returnValue instanceof String) {
    return new ModelAndView((String) returnValue).addAllObjects(implicitModel);
}

Ответы [ 3 ]

1 голос
/ 23 апреля 2011

Судя по комментариям, вы представляете JSON как ответ. При использовании Jackson (один из параметров Spring по умолчанию для обработки JSON) вы можете указать «RenderedAttributes», чтобы не все поля вашей модели помещались в ответ JSON, а только те, которые вы явно указали.

"По умолчанию все содержимое карты модели (за исключением классов, специфичных для фреймворка) будет закодировано как JSON. В тех случаях, когда необходимо отфильтровать содержимое карты, пользователи могут указать определенный набор атрибуты модели для кодирования через свойство RenderedAttributes. " (из справочника , раздел 16.10

1 голос
/ 30 апреля 2011

Добавьте SpringMap ModelMap в метод обработчика и очистите его.После отправки в VIEW не будет никаких неявных вещей в Моделе.

public ModelAndView handleRequest(ModelMap modelMap, HttpServletRequest request, HttpServletResponse response) {
            modelMap.clear();
    ...
}
0 голосов
/ 23 апреля 2011

То, что Spring называет моделью в методе контроллера, на самом деле является дампом объектов, которые будут доступны для просмотра. Вы не должны использовать все это как данные ответа на запрос. Ваши данные ответа могут быть частью этого.

Я предлагаю вам попробовать вернуть карту, которую вы хотите преобразовать в JSON с аннотацией @ResponseBody. Вам понадобится Джексон на пути к классам. Весна сделает преобразование. Или, если вы хотите придерживаться своего решения, поместите свою карту на карту модели под некоторым стандартным ключом, например, "Ответ".

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