ContextLoader and FrameworkServlet support "contextId" parameter for custom serialization id

This commit is contained in:
Juergen Hoeller
2011-07-03 22:38:11 +00:00
parent 01eab03dca
commit 10d9860457
2 changed files with 58 additions and 27 deletions

View File

@@ -77,11 +77,18 @@ import org.springframework.util.ObjectUtils;
public class ContextLoader {
/**
* Config param for the root WebApplicationContext implementation class to
* use: "<code>contextClass</code>"
* Config param for the root WebApplicationContext implementation class to use:
* "<code>contextClass</code>"
*/
public static final String CONTEXT_CLASS_PARAM = "contextClass";
/**
* Config param for the root WebApplicationContext id,
* to be used as serialization id for the underlying BeanFactory:
* "<code>contextId</code>"
*/
public static final String CONTEXT_ID_PARAM = "contextId";
/**
* Name of servlet context parameter (i.e., "<code>contextConfigLocation</code>")
* that can specify the config location for the root context, falling back
@@ -251,21 +258,20 @@ public class ContextLoader {
(ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);
// Assign the best possible id value.
if (sc.getMajorVersion() == 2 && sc.getMinorVersion() < 5) {
// Servlet <= 2.4: resort to name specified in web.xml, if any.
String servletContextName = sc.getServletContextName();
wac.setId(ConfigurableWebApplicationContext.APPLICATION_CONTEXT_ID_PREFIX +
ObjectUtils.getDisplayString(servletContextName));
String idParam = sc.getInitParameter(CONTEXT_ID_PARAM);
if (idParam != null) {
wac.setId(idParam);
}
else {
// Servlet 2.5's getContextPath available!
try {
String contextPath = (String) ServletContext.class.getMethod("getContextPath").invoke(sc);
// Generate default id...
if (sc.getMajorVersion() == 2 && sc.getMinorVersion() < 5) {
// Servlet <= 2.4: resort to name specified in web.xml, if any.
wac.setId(ConfigurableWebApplicationContext.APPLICATION_CONTEXT_ID_PREFIX +
ObjectUtils.getDisplayString(contextPath));
ObjectUtils.getDisplayString(sc.getServletContextName()));
}
catch (Exception ex) {
throw new IllegalStateException("Failed to invoke Servlet 2.5 getContextPath method", ex);
else {
wac.setId(ConfigurableWebApplicationContext.APPLICATION_CONTEXT_ID_PREFIX +
ObjectUtils.getDisplayString(sc.getContextPath()));
}
}