From 5ff6191d72489c728d4fa6fbc99af4d0d03643b9 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 8 Jul 2009 15:11:15 +0000 Subject: [PATCH] preserve custom pre-bound RequestAttributes implementations (for Grails) --- .../web/portlet/FrameworkPortlet.java | 17 ++++++++++------- .../web/servlet/FrameworkServlet.java | 17 ++++++++++------- .../context/request/RequestContextListener.java | 4 ++-- .../web/filter/RequestContextFilter.java | 5 ++--- 4 files changed, 24 insertions(+), 19 deletions(-) diff --git a/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/FrameworkPortlet.java b/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/FrameworkPortlet.java index a59f053ae0d..1baaeebf22c 100644 --- a/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/FrameworkPortlet.java +++ b/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/FrameworkPortlet.java @@ -502,8 +502,11 @@ public abstract class FrameworkPortlet extends GenericPortletBean // Expose current RequestAttributes to current thread. RequestAttributes previousRequestAttributes = RequestContextHolder.getRequestAttributes(); - PortletRequestAttributes requestAttributes = new PortletRequestAttributes(request); - RequestContextHolder.setRequestAttributes(requestAttributes, this.threadContextInheritable); + PortletRequestAttributes requestAttributes = null; + if (previousRequestAttributes == null || previousRequestAttributes.getClass().equals(PortletRequestAttributes.class)) { + requestAttributes = new PortletRequestAttributes(request); + RequestContextHolder.setRequestAttributes(requestAttributes, this.threadContextInheritable); + } if (logger.isTraceEnabled()) { logger.trace("Bound request context to thread: " + request); @@ -541,12 +544,12 @@ public abstract class FrameworkPortlet extends GenericPortletBean } finally { - // Reset thread-bound context. - RequestContextHolder.setRequestAttributes(previousRequestAttributes, this.threadContextInheritable); + // Clear request attributes and reset thread-bound context. LocaleContextHolder.setLocaleContext(previousLocaleContext, this.threadContextInheritable); - - // Clear request attributes. - requestAttributes.requestCompleted(); + if (requestAttributes != null) { + RequestContextHolder.setRequestAttributes(previousRequestAttributes, this.threadContextInheritable); + requestAttributes.requestCompleted(); + } if (logger.isTraceEnabled()) { logger.trace("Cleared thread-bound resource request context: " + request); } diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/FrameworkServlet.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/FrameworkServlet.java index 6a9b68aedff..f2174b378bf 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/FrameworkServlet.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/FrameworkServlet.java @@ -603,8 +603,11 @@ public abstract class FrameworkServlet extends HttpServletBean // Expose current RequestAttributes to current thread. RequestAttributes previousRequestAttributes = RequestContextHolder.getRequestAttributes(); - ServletRequestAttributes requestAttributes = new ServletRequestAttributes(request); - RequestContextHolder.setRequestAttributes(requestAttributes, this.threadContextInheritable); + ServletRequestAttributes requestAttributes = null; + if (previousRequestAttributes == null || previousRequestAttributes.getClass().equals(ServletRequestAttributes.class)) { + requestAttributes = new ServletRequestAttributes(request); + RequestContextHolder.setRequestAttributes(requestAttributes, this.threadContextInheritable); + } if (logger.isTraceEnabled()) { logger.trace("Bound request context to thread: " + request); @@ -627,12 +630,12 @@ public abstract class FrameworkServlet extends HttpServletBean } finally { - // Reset thread-bound context. - RequestContextHolder.setRequestAttributes(previousRequestAttributes, this.threadContextInheritable); + // Clear request attributes and reset thread-bound context. LocaleContextHolder.setLocaleContext(previousLocaleContext, this.threadContextInheritable); - - // Clear request attributes. - requestAttributes.requestCompleted(); + if (requestAttributes != null) { + RequestContextHolder.setRequestAttributes(previousRequestAttributes, this.threadContextInheritable); + requestAttributes.requestCompleted(); + } if (logger.isTraceEnabled()) { logger.trace("Cleared thread-bound request context: " + request); } diff --git a/org.springframework.web/src/main/java/org/springframework/web/context/request/RequestContextListener.java b/org.springframework.web/src/main/java/org/springframework/web/context/request/RequestContextListener.java index 34f273f4f20..eb78f8e3efd 100644 --- a/org.springframework.web/src/main/java/org/springframework/web/context/request/RequestContextListener.java +++ b/org.springframework.web/src/main/java/org/springframework/web/context/request/RequestContextListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -80,8 +80,8 @@ public class RequestContextListener implements ServletRequestListener { if (attributes == null) { attributes = threadAttributes; } - RequestContextHolder.resetRequestAttributes(); LocaleContextHolder.resetLocaleContext(); + RequestContextHolder.resetRequestAttributes(); } if (attributes != null) { attributes.requestCompleted(); diff --git a/org.springframework.web/src/main/java/org/springframework/web/filter/RequestContextFilter.java b/org.springframework.web/src/main/java/org/springframework/web/filter/RequestContextFilter.java index 499bab42bd5..725907e03e9 100644 --- a/org.springframework.web/src/main/java/org/springframework/web/filter/RequestContextFilter.java +++ b/org.springframework.web/src/main/java/org/springframework/web/filter/RequestContextFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ package org.springframework.web.filter; import java.io.IOException; - import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -84,8 +83,8 @@ public class RequestContextFilter extends OncePerRequestFilter { filterChain.doFilter(request, response); } finally { - RequestContextHolder.resetRequestAttributes(); LocaleContextHolder.resetLocaleContext(); + RequestContextHolder.resetRequestAttributes(); attributes.requestCompleted(); if (logger.isDebugEnabled()) { logger.debug("Cleared thread-bound request context: " + request);