mirror of
https://github.com/spring-projects/spring-boot.git
synced 2024-09-03 04:26:12 +08:00
Merge branch '1.1.x'
This commit is contained in:
commit
55a84c7bd7
@ -1001,26 +1001,28 @@ You can also use regular Spring MVC features like http://docs.spring.io/spring/d
|
||||
methods] and http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#mvc-ann-controller-advice[`@ControllerAdvice`].
|
||||
The `ErrorController` will then pick up any unhandled exceptions.
|
||||
|
||||
N.B. if you register an `ErrorPage` with a path that will end up being handled by a `Filter` (e.g. as is common with some non-Spring web frameworks,
|
||||
like Jersey and Wicket), then the `Filter` has to be explicitly registered as an `ERROR` dispatcher, e.g.
|
||||
N.B. if you register an `ErrorPage` with a path that will end up being handled by a
|
||||
`Filter` (e.g. as is common with some non-Spring web frameworks, like Jersey and Wicket),
|
||||
then the `Filter` has to be explicitly registered as an `ERROR` dispatcher, e.g.
|
||||
|
||||
[source,java,indent=0,subs="verbatim,quotes,attributes"]
|
||||
----
|
||||
@Bean
|
||||
public FilterRegistrationBean myFilter() {
|
||||
@Bean
|
||||
public FilterRegistrationBean myFilter() {
|
||||
|
||||
FilterRegistrationBean registration = new FilterRegistrationBean();
|
||||
registration.setFilter(new MyFilter());
|
||||
...
|
||||
registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
|
||||
return registration;
|
||||
FilterRegistrationBean registration = new FilterRegistrationBean();
|
||||
registration.setFilter(new MyFilter());
|
||||
...
|
||||
registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
|
||||
return registration;
|
||||
|
||||
}
|
||||
}
|
||||
----
|
||||
|
||||
(the default `FilterRegistrationBean` does not include the `ERROR` dispatcher type).
|
||||
|
||||
|
||||
|
||||
[[boot-features-embedded-container]]
|
||||
=== Embedded servlet container support
|
||||
Spring Boot includes support for embedded Tomcat and Jetty servers. Most developers will
|
||||
|
@ -27,6 +27,8 @@ import java.util.List;
|
||||
import java.util.Queue;
|
||||
import java.util.Set;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.beans.BeansException;
|
||||
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
|
||||
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
|
||||
@ -106,6 +108,8 @@ public class ConfigFileApplicationListener implements
|
||||
|
||||
public static final int DEFAULT_ORDER = Ordered.HIGHEST_PRECEDENCE + 10;
|
||||
|
||||
private static Log logger = LogFactory.getLog(ConfigFileApplicationListener.class);
|
||||
|
||||
private String searchLocations;
|
||||
|
||||
private String names;
|
||||
@ -114,6 +118,8 @@ public class ConfigFileApplicationListener implements
|
||||
|
||||
private final ConversionService conversionService = new DefaultConversionService();
|
||||
|
||||
private final List<Object> debug = new ArrayList<Object>();
|
||||
|
||||
@Override
|
||||
public void onApplicationEvent(ApplicationEvent event) {
|
||||
if (event instanceof ApplicationEnvironmentPreparedEvent) {
|
||||
@ -140,9 +146,21 @@ public class ConfigFileApplicationListener implements
|
||||
}
|
||||
|
||||
private void onApplicationPreparedEvent(ApplicationPreparedEvent event) {
|
||||
logDebugMessages();
|
||||
addPostProcessors(event.getApplicationContext());
|
||||
}
|
||||
|
||||
private void logDebugMessages() {
|
||||
// Debug logging is deferred because the Logging initialization might not have
|
||||
// run at the time that config file decisions are taken
|
||||
if (logger.isDebugEnabled()) {
|
||||
for (Object message : this.debug) {
|
||||
logger.debug(message);
|
||||
}
|
||||
}
|
||||
this.debug.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Add config file property sources to the specified environment.
|
||||
* @param environment the environment to add source to
|
||||
@ -270,6 +288,8 @@ public class ConfigFileApplicationListener implements
|
||||
|
||||
private boolean activatedProfiles;
|
||||
|
||||
private final List<Object> debug = ConfigFileApplicationListener.this.debug;
|
||||
|
||||
public Loader(ConfigurableEnvironment environment, ResourceLoader resourceLoader) {
|
||||
this.environment = environment;
|
||||
this.resourceLoader = resourceLoader == null ? new DefaultResourceLoader()
|
||||
@ -280,7 +300,6 @@ public class ConfigFileApplicationListener implements
|
||||
this.propertiesLoader = new PropertySourcesLoader();
|
||||
this.profiles = Collections.asLifoQueue(new LinkedList<String>());
|
||||
this.activatedProfiles = false;
|
||||
|
||||
if (this.environment.containsProperty(ACTIVE_PROFILES_PROPERTY)) {
|
||||
// Any pre-existing active profiles set via property sources (e.g. System
|
||||
// properties) take precedence over those added in config files.
|
||||
@ -354,29 +373,46 @@ public class ConfigFileApplicationListener implements
|
||||
private PropertySource<?> loadIntoGroup(String identifier, String location,
|
||||
String profile) throws IOException {
|
||||
Resource resource = this.resourceLoader.getResource(location);
|
||||
PropertySource<?> propertySource = null;
|
||||
if (resource != null) {
|
||||
String name = "applicationConfig: [" + location + "]";
|
||||
String group = "applicationConfig: [" + identifier + "]";
|
||||
PropertySource<?> propertySource = this.propertiesLoader.load(resource,
|
||||
group, name, profile);
|
||||
propertySource = this.propertiesLoader.load(resource, group, name,
|
||||
profile);
|
||||
if (propertySource != null) {
|
||||
maybeActivateProfiles(propertySource
|
||||
.getProperty(ACTIVE_PROFILES_PROPERTY));
|
||||
addIncludeProfiles(propertySource
|
||||
.getProperty(INCLUDE_PROFILES_PROPERTY));
|
||||
}
|
||||
return propertySource;
|
||||
}
|
||||
return null;
|
||||
|
||||
StringBuilder msg = new StringBuilder();
|
||||
msg.append(propertySource == null ? "Skipped " : "Loaded ");
|
||||
msg.append("config file ");
|
||||
msg.append("'" + location + "' ");
|
||||
msg.append(StringUtils.hasLength(profile) ? "for profile " : "");
|
||||
msg.append(resource == null || !resource.exists() ? "resource not found" : "");
|
||||
this.debug.add(msg);
|
||||
|
||||
return propertySource;
|
||||
}
|
||||
|
||||
private void maybeActivateProfiles(Object value) {
|
||||
if (!this.activatedProfiles == true) {
|
||||
Set<String> profiles = getProfilesForValue(value);
|
||||
activateProfiles(profiles);
|
||||
if (profiles.size() > 0) {
|
||||
this.activatedProfiles = true;
|
||||
if (this.activatedProfiles) {
|
||||
if (value != null) {
|
||||
this.debug.add("Profiles already activated, '" + value
|
||||
+ "' will not be applied");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
Set<String> profiles = getProfilesForValue(value);
|
||||
activateProfiles(profiles);
|
||||
if (profiles.size() > 0) {
|
||||
this.debug.add("Activated profiles "
|
||||
+ StringUtils.collectionToCommaDelimitedString(profiles));
|
||||
this.activatedProfiles = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -18,6 +18,8 @@ package org.springframework.boot.context.config;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.core.env.ConfigurableEnvironment;
|
||||
import org.springframework.core.env.PropertySource;
|
||||
import org.springframework.core.env.StandardEnvironment;
|
||||
@ -33,6 +35,8 @@ import org.springframework.util.StringUtils;
|
||||
*/
|
||||
public class RandomValuePropertySource extends PropertySource<Random> {
|
||||
|
||||
private static Log logger = LogFactory.getLog(RandomValuePropertySource.class);
|
||||
|
||||
public RandomValuePropertySource(String name) {
|
||||
super(name, new Random());
|
||||
}
|
||||
@ -42,6 +46,9 @@ public class RandomValuePropertySource extends PropertySource<Random> {
|
||||
if (!name.startsWith("random.")) {
|
||||
return null;
|
||||
}
|
||||
if (logger.isTraceEnabled()) {
|
||||
logger.trace("Generating random property for '" + name + "'");
|
||||
}
|
||||
if (name.endsWith("int")) {
|
||||
return getSource().nextInt();
|
||||
}
|
||||
@ -71,6 +78,7 @@ public class RandomValuePropertySource extends PropertySource<Random> {
|
||||
environment.getPropertySources().addAfter(
|
||||
StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME,
|
||||
new RandomValuePropertySource("random"));
|
||||
logger.trace("RandomValuePropertySource add to Environment");
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user