diff --git a/web/src/main/java/org/springframework/security/web/context/support/SecurityWebApplicationContextUtils.java b/web/src/main/java/org/springframework/security/web/context/support/SecurityWebApplicationContextUtils.java index 0a9dc3fec5..e8c4afda28 100644 --- a/web/src/main/java/org/springframework/security/web/context/support/SecurityWebApplicationContextUtils.java +++ b/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 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; + } }