Wednesday, September 10, 2008

Sitemesh decorator goes berzerk with Spring MultipartResolver

The Issue
This particular blog disscusses a particular issue with Sitemesh when used with Spring Framework. The issue in sitemesh occurs when the size of the uploaded file exceeds the maximum settings set in Spring. A workaround is also provided for those who are seeking for alternatives.
Framework Versions
  • Spring Framework: 1.x
  • Sitemesh: 2.2.1
Given the Following Situation

Given the following multipartResolver in my spring servlet xml config file:

1.) servlet-xml file

<bean id="multipartResolver"
       class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
   <property name="maxUploadSize">
     <value>20000</value>
   </property>
   <property name="maxInMemorySize">
     <value>0</value>
   </property>
</bean>

2.) A multi-part form page that uploads a file.

3.) One or more sitemesh decorators applied to the page (1 main decorator and a few inline decorators).

When Submitting the Form

Upon submitting the form, the request goes to the DispatcherServlet and calls the checkMultipart(request) method. If the size of the file being uploaded exceeds the max, a MultipartException gets thrown but does not get propagated. Spring tries to resolve the view assigned to this exception mapped with SimpleMappingExceptionResolver. The implication to this is that all pages being decorated by sitemesh are showing the default error page assigned.

So if a decorator is used on the menu, header, sidebar, and body of the page then the user will see 4 exception pages.

I've created a workaround for this by extending the DispatcherServlet and overloading the processHandlerException(...) method to rethrow any exceptions of type MultipartException (and not try to resolve the exception page assigned in spring).

No comments: