wiki:RedirectWithSpringWebMvc

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.