diff --git a/spring-context/src/main/java/org/springframework/context/support/LiveBeansView.java b/spring-context/src/main/java/org/springframework/context/support/LiveBeansView.java index 0d6dba80aa..73863ef6c0 100644 --- a/spring-context/src/main/java/org/springframework/context/support/LiveBeansView.java +++ b/spring-context/src/main/java/org/springframework/context/support/LiveBeansView.java @@ -57,6 +57,7 @@ public class LiveBeansView implements LiveBeansViewMBean, ApplicationContextAwar private static final Set applicationContexts = new LinkedHashSet(); + static void registerApplicationContext(ConfigurableApplicationContext applicationContext) { String mbeanDomain = applicationContext.getEnvironment().getProperty(MBEAN_DOMAIN_PROPERTY_NAME); if (mbeanDomain != null) { @@ -94,6 +95,7 @@ public class LiveBeansView implements LiveBeansViewMBean, ApplicationContextAwar private ConfigurableApplicationContext applicationContext; + public void setApplicationContext(ApplicationContext applicationContext) { Assert.isTrue(applicationContext instanceof ConfigurableApplicationContext, "ApplicationContext does not implement ConfigurableApplicationContext"); @@ -173,8 +175,7 @@ public class LiveBeansView implements LiveBeansViewMBean, ApplicationContextAwar else { result.append("\"type\": null,\n"); } - String resource = StringUtils.replace(bd.getResourceDescription(), "\\", "/"); - result.append("\"resource\": \"").append(resource).append("\",\n"); + result.append("\"resource\": \"").append(getEscapedResourceDescription(bd)).append("\",\n"); result.append("\"dependencies\": ["); String[] dependencies = bf.getDependenciesForBean(beanName); if (dependencies.length > 0) { @@ -199,7 +200,7 @@ public class LiveBeansView implements LiveBeansViewMBean, ApplicationContextAwar } /** - * Determine whether the specified bean is eligible for inclusion in the + * Determine whether the specified bean is eligible for inclusion in the * LiveBeansView JSON snapshot. * @param beanName the name of the bean * @param bd the corresponding bean definition @@ -211,4 +212,31 @@ public class LiveBeansView implements LiveBeansViewMBean, ApplicationContextAwar (!bd.isLazyInit() || bf.containsSingleton(beanName))); } + /** + * Determine a resource description for the given bean definition and + * apply basic JSON escaping (backslashes, double quotes) to it. + * @param bd the bean definition to build the resource description for + * @return the JSON-escaped resource description + */ + protected String getEscapedResourceDescription(BeanDefinition bd) { + String resourceDescription = bd.getResourceDescription(); + if (resourceDescription == null) { + return null; + } + StringBuilder result = new StringBuilder(resourceDescription.length() + 16); + for (int i = 0; i < resourceDescription.length(); i++) { + char character = resourceDescription.charAt(i); + if (character == '\\') { + result.append('/'); + } + else if (character == '"') { + result.append("\\").append('"'); + } + else { + result.append(character); + } + } + return result.toString(); + } + }