Spring Web MVC has some really neat features, such as being able to forward or redirect requests by prefixing redirect: or forward: to the returned controller name. However, to get this to work can sometimes be confusing is you are also using a JSTL or Tiles view resolver. If it is not working you'll see a message like this:
javax.servlet.ServletException: Could not resolve view with name 'redirect:/w' in servlet with name 'workflow' org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1166) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:902) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511) javax.servlet.http.HttpServlet.service(HttpServlet.java:710) javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
What happens is that your org.springframework.web.servlet.view.InternalResourceViewResolver? or org.springframework.web.servlet.view.URLResourceViewResolver is actually responsible for turning the redirect: into an actual redirect. This usually happens because InternalResourceViewResolver? is put at the end of the resolver list. In a situation where you have a JSTL view wrapped in an InternalResourceViewResolver?, this functionality is disabled, because of a flag in InternalResourceViewResolver? which says if viewNames is set, then don't resolve these kinds of views.
<bean id="jstlViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="order" value="1"/> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="viewNames" value="*.jsp"/> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> </bean>
So, you need to set an order on your wrapped InternalResourceViewResolver? and then place a vanilla resolver at the end to make this work. This got confusing for me because if you use something like a Tiles view, and don't specify a particular view name pattern then the redirect will magically start working
<!-- Resolve views using Tiles --> <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" /> </bean>
So really the above snippet will work, but is incomplete, and if this is what you copy you'll be confused by the behaviour.
