/** * Replace {@code Servlet}- and {@code Portlet}-based {@link * org.springframework.core.env.PropertySource.StubPropertySource stub property sources} with * actual instances populated with the given {@code servletContext}, {@code portletContext} and * {@code portletConfig} objects. * * <p>This method is idempotent with respect to the fact it may be called any number of times but * will perform replacement of stub property sources with their corresponding actual property * sources once and only once. * * @param propertySources the {@link MutablePropertySources} to initialize (must not be {@code * null}) * @param servletContext the current {@link ServletContext} (ignored if {@code null} or if the * {@link * org.springframework.web.context.support.StandardServletEnvironment#SERVLET_CONTEXT_PROPERTY_SOURCE_NAME * servlet context property source} has already been initialized) * @param portletContext the current {@link PortletContext} (ignored if {@code null} or if the * {@link StandardPortletEnvironment#PORTLET_CONTEXT_PROPERTY_SOURCE_NAME portlet context * property source} has already been initialized) * @param portletConfig the current {@link PortletConfig} (ignored if {@code null} or if the * {@link StandardPortletEnvironment#PORTLET_CONFIG_PROPERTY_SOURCE_NAME portlet config * property source} has already been initialized) * @see org.springframework.core.env.PropertySource.StubPropertySource * @see * org.springframework.web.context.support.WebApplicationContextUtils#initServletPropertySources(MutablePropertySources, * ServletContext) * @see org.springframework.core.env.ConfigurableEnvironment#getPropertySources() */ public static void initPortletPropertySources( MutablePropertySources propertySources, ServletContext servletContext, PortletContext portletContext, PortletConfig portletConfig) { Assert.notNull(propertySources, "propertySources must not be null"); WebApplicationContextUtils.initServletPropertySources(propertySources, servletContext); if (portletContext != null && propertySources.contains( StandardPortletEnvironment.PORTLET_CONTEXT_PROPERTY_SOURCE_NAME)) { propertySources.replace( StandardPortletEnvironment.PORTLET_CONTEXT_PROPERTY_SOURCE_NAME, new PortletContextPropertySource( StandardPortletEnvironment.PORTLET_CONTEXT_PROPERTY_SOURCE_NAME, portletContext)); } if (portletConfig != null && propertySources.contains( StandardPortletEnvironment.PORTLET_CONFIG_PROPERTY_SOURCE_NAME)) { propertySources.replace( StandardPortletEnvironment.PORTLET_CONFIG_PROPERTY_SOURCE_NAME, new PortletConfigPropertySource( StandardPortletEnvironment.PORTLET_CONFIG_PROPERTY_SOURCE_NAME, portletConfig)); } }
@Override public void initialize(ConfigurableWebApplicationContext applicationContext) { Resource resource = null; ServletContext servletContext = applicationContext.getServletContext(); WebApplicationContextUtils.initServletPropertySources( applicationContext.getEnvironment().getPropertySources(), servletContext, applicationContext.getServletConfig()); ServletConfig servletConfig = applicationContext.getServletConfig(); String locations = servletConfig == null ? null : servletConfig.getInitParameter(PROFILE_CONFIG_FILE_LOCATIONS); resource = getResource(servletContext, applicationContext, locations); if (resource == null) { servletContext.log( "No YAML environment properties from servlet. Defaulting to servlet context."); locations = servletContext.getInitParameter(PROFILE_CONFIG_FILE_LOCATIONS); resource = getResource(servletContext, applicationContext, locations); } try { servletContext.log("Loading YAML environment properties from location: " + resource); YamlMapFactoryBean factory = new YamlMapFactoryBean(); factory.setResolutionMethod(ResolutionMethod.OVERRIDE_AND_IGNORE); List<Resource> resources = new ArrayList<Resource>(); String defaultLocation = servletConfig == null ? null : servletConfig.getInitParameter(PROFILE_CONFIG_FILE_DEFAULT); if (defaultLocation != null) { Resource defaultResource = new ClassPathResource(defaultLocation); if (defaultResource.exists()) { resources.add(defaultResource); } } resources.add(resource); factory.setResources(resources.toArray(new Resource[resources.size()])); Map<String, Object> map = factory.getObject(); String yamlStr = (new Yaml()).dump(map); map.put(rawYamlKey, yamlStr); NestedMapPropertySource properties = new NestedMapPropertySource("servletConfigYaml", map); applicationContext.getEnvironment().getPropertySources().addLast(properties); applySpringProfiles(applicationContext.getEnvironment(), servletContext); applyLog4jConfiguration(applicationContext.getEnvironment(), servletContext); } catch (Exception e) { servletContext.log("Error loading YAML environment properties from location: " + resource, e); } }
@Override protected void initPropertySources() { super.initPropertySources(); WebApplicationContextUtils.initServletPropertySources( this.getEnvironment().getPropertySources(), this.servletContext); }
/** * Convenient variant of {@link #initServletPropertySources(MutablePropertySources, * ServletContext, ServletConfig)} that always provides {@code null} for the {@link ServletConfig} * parameter. * * @see #initServletPropertySources(MutablePropertySources, ServletContext, ServletConfig) */ public static void initServletPropertySources( MutablePropertySources propertySources, ServletContext servletContext) { initServletPropertySources(propertySources, servletContext, null); }