diff --git a/grails-plugin-url-mappings/src/main/groovy/org/codehaus/groovy/grails/web/mapping/DefaultUrlMappingInfo.java b/grails-plugin-url-mappings/src/main/groovy/org/codehaus/groovy/grails/web/mapping/DefaultUrlMappingInfo.java index 097e98c09b2..595967c491b 100644 --- a/grails-plugin-url-mappings/src/main/groovy/org/codehaus/groovy/grails/web/mapping/DefaultUrlMappingInfo.java +++ b/grails-plugin-url-mappings/src/main/groovy/org/codehaus/groovy/grails/web/mapping/DefaultUrlMappingInfo.java @@ -24,6 +24,7 @@ import javax.servlet.http.HttpServletRequest; import org.codehaus.groovy.grails.commons.GrailsApplication; +import org.codehaus.groovy.grails.web.errors.GrailsExceptionResolver; import org.codehaus.groovy.grails.web.mapping.exceptions.UrlMappingException; import org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest; import org.codehaus.groovy.grails.web.util.WebUtils; @@ -135,6 +136,7 @@ public String getId() { @SuppressWarnings("unchecked") private String checkDispatchAction(HttpServletRequest request) { + if(request.getAttribute(GrailsExceptionResolver.EXCEPTION_ATTRIBUTE)!= null) return null; String dispatchActionName = null; Enumeration paramNames = tryMultipartParams(request, request.getParameterNames()); diff --git a/grails-test-suite-web/src/test/groovy/org/codehaus/groovy/grails/web/mapping/UrlMappingParameterTests.groovy b/grails-test-suite-web/src/test/groovy/org/codehaus/groovy/grails/web/mapping/UrlMappingParameterTests.groovy index 3ddd0970d68..da364eac867 100644 --- a/grails-test-suite-web/src/test/groovy/org/codehaus/groovy/grails/web/mapping/UrlMappingParameterTests.groovy +++ b/grails-test-suite-web/src/test/groovy/org/codehaus/groovy/grails/web/mapping/UrlMappingParameterTests.groovy @@ -3,6 +3,8 @@ package org.codehaus.groovy.grails.web.mapping import org.codehaus.groovy.grails.web.servlet.mvc.AbstractGrailsControllerTests import org.springframework.core.io.ByteArrayResource import org.springframework.mock.web.MockServletContext +import org.codehaus.groovy.grails.web.util.WebUtils +import org.codehaus.groovy.grails.web.errors.GrailsExceptionResolver /** * @author Graeme Rocher @@ -49,6 +51,38 @@ class UrlMappings { } } ''' + void testDontUseDispatchActionIfExceptionPresent() { + Closure closure = new GroovyClassLoader().parseClass(test1).mappings + def mappings = evaluator.evaluateMappings(closure) + + webRequest.currentRequest.addParameter("${WebUtils.DISPATCH_ACTION_PARAMETER}foo", "true") + webRequest.currentRequest.setAttribute(GrailsExceptionResolver.EXCEPTION_ATTRIBUTE, new RuntimeException("bad")) + def holder = new DefaultUrlMappingsHolder(mappings) + def info = holder.match('/foo/list') + + assert info != null + + info.configure webRequest + + assert info.actionName == 'list' + + } + void testUseDispatchAction() { + Closure closure = new GroovyClassLoader().parseClass(test1).mappings + def mappings = evaluator.evaluateMappings(closure) + + webRequest.currentRequest.addParameter("${WebUtils.DISPATCH_ACTION_PARAMETER}foo", "true") + def holder = new DefaultUrlMappingsHolder(mappings) + def info = holder.match('/foo/list') + + assert info != null + + info.configure webRequest + + assert info.actionName == 'foo' + + assertEquals "de", webRequest.params.lang + } void testNotEqual() { Closure closure = new GroovyClassLoader().parseClass(test3).mappings diff --git a/grails-web/src/main/groovy/org/codehaus/groovy/grails/web/util/WebUtils.java b/grails-web/src/main/groovy/org/codehaus/groovy/grails/web/util/WebUtils.java index 4b7e3c40743..b85d89d0e21 100644 --- a/grails-web/src/main/groovy/org/codehaus/groovy/grails/web/util/WebUtils.java +++ b/grails-web/src/main/groovy/org/codehaus/groovy/grails/web/util/WebUtils.java @@ -271,6 +271,9 @@ public static String forwardRequestForUrlMappingInfo(HttpServletRequest request, @SuppressWarnings({ "unchecked", "rawtypes" }) public static String forwardRequestForUrlMappingInfo(HttpServletRequest request, HttpServletResponse response, UrlMappingInfo info, Map model, boolean includeParams) throws ServletException, IOException { + exposeForwardRequestAttributes(request); + exposeRequestAttributes(request, model); + String forwardUrl = buildDispatchUrlForMapping(info, includeParams); //populateParamsForMapping(info); @@ -284,8 +287,6 @@ public static String forwardRequestForUrlMappingInfo(HttpServletRequest request, webRequest.removeAttribute(GrailsApplicationAttributes.MODEL_AND_VIEW, 0); webRequest.setActionName(info.getActionName()); - exposeForwardRequestAttributes(request); - exposeRequestAttributes(request, model); dispatcher.forward(request, response); return forwardUrl; }