Browse Source

SEC-3158 findRequiredWebApplicationContext() compatibility with spring framework 4.1.x

Alex Panchenko 9 years ago
parent
commit
409a74330e

+ 25 - 1
web/src/main/java/org/springframework/security/web/context/support/SecurityWebApplicationContextUtils.java

@@ -15,6 +15,7 @@
  */
 package org.springframework.security.web.context.support;
 
+import java.util.Enumeration;
 import javax.servlet.ServletContext;
 
 import org.springframework.web.context.WebApplicationContext;
@@ -43,10 +44,33 @@ public abstract class SecurityWebApplicationContextUtils extends WebApplicationC
 	 * @throws IllegalStateException if no WebApplicationContext can be found
 	 */
 	public static WebApplicationContext findRequiredWebApplicationContext(ServletContext servletContext) {
-		WebApplicationContext wac = findWebApplicationContext(servletContext);
+		WebApplicationContext wac = _findWebApplicationContext(servletContext);
 		if (wac == null) {
 			throw new IllegalStateException("No WebApplicationContext found: no ContextLoaderListener registered?");
 		}
 		return wac;
 	}
+
+	/**
+	 * Copy of {@link #findWebApplicationContext(ServletContext)} for compatibility with spring framework 4.1.x.
+	 * @see #findWebApplicationContext(ServletContext)
+	 */
+	private static WebApplicationContext _findWebApplicationContext(ServletContext sc) {
+		WebApplicationContext wac = getWebApplicationContext(sc);
+		if (wac == null) {
+			Enumeration<String> attrNames = sc.getAttributeNames();
+			while (attrNames.hasMoreElements()) {
+				String attrName = attrNames.nextElement();
+				Object attrValue = sc.getAttribute(attrName);
+				if (attrValue instanceof WebApplicationContext) {
+					if (wac != null) {
+						throw new IllegalStateException("No unique WebApplicationContext found: more than one " +
+								"DispatcherServlet registered with publishContext=true?");
+					}
+					wac = (WebApplicationContext) attrValue;
+				}
+			}
+		}
+		return wac;
+	}
 }