Cannot expose request attribute 'website' because of an existing model object of the same name 的解决方案

2017-08-06|来源:

在使用springmvc+freemarker,有可能你会遇到以下异常(如:资源找不到重定向到404的请求时):

javax.servlet.ServletException: Cannot expose request attribute 'website' because of an existing model object of the same name

at org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:123)

at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)

at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1244)

at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1027)

at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:971)

at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)

at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)

at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)


看一下源码,可以发现如果exposeRequestAttributes设为true,model中已经存在该key,且allowRequestOverride为false是,就会报该错。session一样:

protected final void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
    String attribute;
    Object attributeValue;
    if(this.exposeRequestAttributes) {
        for(Enumeration en = request.getAttributeNames(); en.hasMoreElements(); model.put(attribute, attributeValue)) {
            attribute = (String)en.nextElement();
            if(model.containsKey(attribute) && !this.allowRequestOverride) {
                throw new ServletException("Cannot expose request attribute '" + attribute + "' because of an existing model object of the same name");
            }
 
            attributeValue = request.getAttribute(attribute);
            if(this.logger.isDebugEnabled()) {
                this.logger.debug("Exposing request attribute '" + attribute + "' with value [" + attributeValue + "] to model");
            }
        }
    }
 
    if(this.exposeSessionAttributes) {
        HttpSession session = request.getSession(false);
        Object attributeValue;
        String attribute;
        if(session != null) {
            for(Enumeration en = session.getAttributeNames(); en.hasMoreElements(); model.put(attribute, attributeValue)) {
                attribute = (String)en.nextElement();
                if(model.containsKey(attribute) && !this.allowSessionOverride) {
                    throw new ServletException("Cannot expose session attribute '" + attribute + "' because of an existing model object of the same name");
                }
 
                attributeValue = session.getAttribute(attribute);
                if(this.logger.isDebugEnabled()) {
                    this.logger.debug("Exposing session attribute '" + attribute + "' with value [" + attributeValue + "] to model");
                }
            }
        }
    }
 
    if(this.exposeSpringMacroHelpers) {
        if(model.containsKey("springMacroRequestContext")) {
            throw new ServletException("Cannot expose bind macro helper 'springMacroRequestContext' because of an existing model object of the same name");
        }
 
        model.put("springMacroRequestContext", new RequestContext(request, response, this.getServletContext(), model));
    }
 
    this.applyContentType(response);
    this.renderMergedTemplateModel(model, request, response);
}


解决方法可以把allowRequestOverride 设为 true,下面是freemarker视图的配置:

<!-- 配置freeMarker视图解析器 -->
<bean id="viewResolverFtl" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
    <property name="contentType" value="text/html; charset=UTF-8"/>
    <property name="exposeRequestAttributes" value="true"/>
    <property name="exposeSessionAttributes" value="true"/>
    <property name="exposeSpringMacroHelpers" value="true"/>
    <property name="allowSessionOverride" value="true" />
    <property name="allowRequestOverride" value="true" />
    <property name="cache" value="true"/>
    <property name="suffix" value=".ftl"/>
    <property name="order" value="0"/>
</bean>


相关问答

更多

Python无法连接mongodb:'module' object has no attribute 'Connection'

>>> from pymongo import MongoClient >>> client=MongoClient()#链接默认的host和port >>> client MongoClient('localhost', 27017) pymongo 中没有Connection这个方法

如何把springmvc model 生成pdf文件

本文先叙述,如何操作PDF模板生成PDF文件,再说明在SpringMVC中如何根据PDF模板生成PDF文件。 使用PDF模板生成PDF文件需要以下几个步骤: 下面按步骤说明: 1. 使用Microsoft Office Word画好模板 此步骤就不详述了,就是一个普通的Word文件(template.docx)。给个示例截图: 2. 使用Adobe Acrobat X Pro将Word文件转换为带表单字段的PDF模板文件 1) 打开Adobe Acrobat X Pro 2) 选择“创建PDF表单 ...

如何把springmvc model 生成pdf文件

本文先叙述,如何操作PDF模板生成PDF文件,再说明在SpringMVC中如何根据PDF模板生成PDF文件。 使用PDF模板生成PDF文件需要以下几个步骤: 下面按步骤说明: 1. 使用Microsoft Office Word画好模板 此步骤就不详述了,就是一个普通的Word文件(template.docx)。给个示例截图: 2. 使用Adobe Acrobat X Pro将Word文件转换为带表单字段的PDF模板文件 1) 打开Adobe Acrobat X Pro 2) 选择“创建PDF表单 ...

spring2.0框架熟悉的来,跪求大神指教,能解决问题,我有多少分给多少分

HelloWorldAction中的属性是这个 private String viewPage; 你注入的时候用了: index 注入错了。 还有就是index.jsp展示的时候错了,你model.put("helloWorld", helloWorld.getMsg()); 了这个,那么应该 ${helloWorld} 11 在index.jsp中

专题教程

JAVA概述
第一部分:java入门基础
第二部分:java常用类
第三部分:jdbc系列教程
第四部分:java高级特征
Gson教程
快速了解 jdk8 新特征

相关文章

更多

最近更新

更多