1515 */
1616package org.grails.web.mapping.mvc
1717
18+ import groovy.transform.CompileDynamic
1819import groovy.transform.CompileStatic
1920import grails.web.mapping.UrlMapping
2021import grails.web.mapping.UrlMappingInfo
@@ -61,6 +62,15 @@ class UrlMappingsHandlerMapping extends AbstractHandlerMapping {
6162 setOrder(-5 )
6263 }
6364
65+ @Autowired
66+ void setHandlerInterceptors (HandlerInterceptor [] handlerInterceptors ) {
67+ for (hi in handlerInterceptors) {
68+ if (! (hi instanceof MappedInterceptor )) {
69+ setInterceptors(hi)
70+ }
71+ }
72+ }
73+
6474 @Autowired (required = false )
6575 void setWebRequestInterceptors (WebRequestInterceptor [] webRequestInterceptors ) {
6676 webRequestHandlerInterceptors = webRequestInterceptors. collect( { WebRequestInterceptor wri ->
@@ -75,16 +85,42 @@ class UrlMappingsHandlerMapping extends AbstractHandlerMapping {
7585
7686 @Override
7787 protected HandlerExecutionChain getHandlerExecutionChain (Object handler , HttpServletRequest request ) {
78- def chain = super . getHandlerExecutionChain(handler, request)
88+ HandlerExecutionChain chain = (handler instanceof HandlerExecutionChain ?
89+ (HandlerExecutionChain ) handler : new HandlerExecutionChain (handler))
7990
8091 // WebRequestInterceptor need to come first, as these include things like Hibernate OSIV
8192 if (webRequestHandlerInterceptors) {
8293 chain. addInterceptors webRequestHandlerInterceptors
8394 }
95+
96+ String lookupPath = this . urlPathHelper. getLookupPathForRequest(request)
97+ for (HandlerInterceptor interceptor in this . adaptedInterceptors) {
98+ if (interceptor instanceof MappedInterceptor ) {
99+ MappedInterceptor mappedInterceptor = mappedInterceptor(interceptor)
100+ if (mappedInterceptor. matches(lookupPath, this . pathMatcher)) {
101+ chain. addInterceptor(mappedInterceptor. getInterceptor())
102+ }
103+ }
104+ else {
105+ chain. addInterceptor(interceptor)
106+ }
107+ }
108+
109+ for (MappedInterceptor mi in getMappedInterceptors()) {
110+ if (mi. matches(lookupPath, this . pathMatcher)) {
111+ chain. addInterceptor(mi. getInterceptor())
112+ }
113+ }
114+
84115 chain. addInterceptor(new ErrorHandlingHandler ())
85116 return chain
86117 }
87118
119+ @CompileDynamic
120+ protected MappedInterceptor mappedInterceptor (HandlerInterceptor interceptor ) {
121+ (MappedInterceptor ) interceptor
122+ }
123+
88124 @Override
89125 protected Object getHandlerInternal (HttpServletRequest request ) throws Exception {
90126
0 commit comments