如何在请求转发后停止将Portlet ImplicitModel传播到下一个处理程序?

时间:2011-04-21 11:04:40

标签: java spring-mvc portlet

对于不使用命令对象进行丰富的模型,处理程序应该返回什么? ModelAndView - 丰富,模型丰富,Map - entriched ......所有内容都使用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);
    }

然后,“model”参数(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();
    }
}

即使我从processSuccess处理程序中删除“Model model”属性,也会发生这种情况。只需将implicitModel参数传播到ajaxResponse视图中,而不仅仅是一个带有我添加的参数的新Map

如何阻止这种传播?

它与this question有关,在spring-portlet-mvc中,有时需要根据某些条件将请求转发给处理程序并将其交给一些要在View中呈现的参数,但不是原始CommandObject,已经处理过。

创建一个JIRA ISSUE - SPR-8267,如果您有相同的问题,请投票。

1 个答案:

答案 0 :(得分:1)

答案是:清除ModelMap以防止它被存储为ImplicitModel。

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

请注意,如果您在方法级别使用@ModelAttribute,则在您调度到同一控制器中的不同处理程序后,modelMap会被填充。

成功执行操作方法调用后,您可能需要手动清除模型以防止操作模型数据存储在ImplicitModel中。

首先,弹簧MVC和弹簧的portlet-MVC来处理POST请求之间的区别在于,弹簧-MVC POST处理程序分派给,而在弹簧的portlet-MVC操作阶段(POST请求处理程序)直接查看始终跟随渲染阶段,由另一个处理程序处理,整个模型保留在请求中(主要是命令对象和BindingResult)... Post/Redirect/Get

该请求被分配到一个视图后

不管怎样,总有过滤模型在那里......通过声明你只想或模型不想再哪些参数的机会......