Как остановить распространение Portlet ImplicitModel в следующий обработчик после запроса пересылки? - PullRequest
3 голосов
/ 21 апреля 2011

что должен вернуть обработчик, чтобы модель не была обогащена объектом команды?ModelAndView - обогащенный, Model - обогащенный, Map - обогащенный ... все обогащается ImplicitModel.Могу ли я как-то остановить распространение неявной модели в представление ajaxResponse?

@ActionMapping(params = "javax.portlet.action=sample")
    public void response(ActionRequest request, ActionResponse response, Bean bean) {
        response.setRenderParameter("javax.portlet.action", "success");
        List<MultipartFile> fileList = request.getFiles("file");
    }
    .....
    @RequestMapping(params = "action=success")
    public ModelAndView processSuccess(RenderRequest request, Model model) throws IOException {
        Map map = new HashMap();
        map.put("sucess", "sucess");
        return new ModelAndView("ajaxResponse", map);
    }

Затем параметры аргумента "модель" (implicitModel) переходит к следующему обработчику из-за этого условия в Spring AnnotationMethodHandlerAdapter.

if (returnValue instanceof ModelAndView) {
    ModelAndView mav = (ModelAndView) returnValue;
    mav.getModelMap().mergeAttributes(implicitModel);
    return mav;
}

Класс View выглядит следующим образом:

    @Component("someView")
    public class SomeView extends AbstractView {
        private Logger logger = Logger.getLogger(SomeView.class);


    @Override
    protected void renderMergedOutputModel(Map map, HttpServletRequest request, HttpServletResponse response)
            throws Exception {
    logger.info("Resolving ajax request view - " + map);
    JSONObject jsonObj = new JSONObject(map);
    logger.info("content Type = " + getContentType());
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    response.getWriter().write(jsonObj.toString());
    response.getWriter().flush();
    }
}

Это происходит, даже если я удалю атрибут "Model model" из обработчика processSuccess.Просто параметры implicitModel распространяются в представление ajaxResponse, а не просто новую Карту с добавленным там параметром

Как остановить это распространение?

Это относится к этому вопросу , в spring-portlet-mvc это иногда необходимо, когда запрос пересылается обработчику на основе некоторого условия и передает его некоторым параметрам, которые должны быть отображены в View, но не исходному CommandObject, который уже был обработан.

СОЗДАН ВЫПУСК ДЖИРА - SPR-8267 , ПОЖАЛУЙСТА, ГОТОВИТЕСЬ, ЕСЛИ У ВАС ЕСТЬ ТО ЖЕ ПРОБЛЕМА.

1 Ответ

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

Ответ: очистите ModelMap, чтобы предотвратить его сохранение в качестве ImplicitModel.

@RequestMapping
public String render(ModelMap modelMap, SessionStatus status, RenderRequest request, RenderResponse response) {
        modelMap.clear();
...
}

Обратите внимание, что если вы используете @ModelAttribute на уровне метода, modelMap заполняется им после отправки в другой обработчик в пределах одного контроллера.

После успешного вызова метода действия вы можете вручную очистить модель, чтобы предотвратить сохранение данных модели действия в ImplicitModel.

Прежде всего, разница между spring-mvc и spring-portlet-mvc в обработке запросов POST заключается в том, что обработчик POST spring-mvc отправляет напрямую VIEW, тогда как в spring-portlet-mvc фаза действия (обработчик запросов POST) всегда следует фаза рендеринга, которая обрабатывается другим обработчиком, и вся модель остается в запросе (в основном объект команды и BindingResult) ... Post / Redirect / Get

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

...