Merge branch '5.2.x'
This commit is contained in:
@@ -117,7 +117,7 @@ configure(allprojects) { project ->
|
||||
dependency "net.sf.ehcache:ehcache:2.10.6"
|
||||
dependency "org.ehcache:jcache:1.0.1"
|
||||
dependency "org.ehcache:ehcache:3.4.0"
|
||||
dependency "org.hibernate:hibernate-core:5.4.19.Final"
|
||||
dependency "org.hibernate:hibernate-core:5.4.20.Final"
|
||||
dependency "org.hibernate:hibernate-validator:6.1.5.Final"
|
||||
dependency "org.webjars:webjars-locator-core:0.45"
|
||||
dependency "org.webjars:underscorejs:1.8.3"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2019 the original author or authors.
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -164,10 +164,10 @@ public class ConstructorArgumentValues {
|
||||
Assert.isTrue(index >= 0, "Index must not be negative");
|
||||
ValueHolder valueHolder = this.indexedArgumentValues.get(index);
|
||||
if (valueHolder != null &&
|
||||
(valueHolder.getType() == null ||
|
||||
(requiredType != null && ClassUtils.matchesTypeName(requiredType, valueHolder.getType()))) &&
|
||||
(valueHolder.getName() == null || "".equals(requiredName) ||
|
||||
(requiredName != null && requiredName.equals(valueHolder.getName())))) {
|
||||
(valueHolder.getType() == null || (requiredType != null &&
|
||||
ClassUtils.matchesTypeName(requiredType, valueHolder.getType()))) &&
|
||||
(valueHolder.getName() == null || (requiredName != null &&
|
||||
(requiredName.isEmpty() || requiredName.equals(valueHolder.getName()))))) {
|
||||
return valueHolder;
|
||||
}
|
||||
return null;
|
||||
@@ -277,17 +277,19 @@ public class ConstructorArgumentValues {
|
||||
* @return the ValueHolder for the argument, or {@code null} if none found
|
||||
*/
|
||||
@Nullable
|
||||
public ValueHolder getGenericArgumentValue(@Nullable Class<?> requiredType, @Nullable String requiredName, @Nullable Set<ValueHolder> usedValueHolders) {
|
||||
public ValueHolder getGenericArgumentValue(@Nullable Class<?> requiredType, @Nullable String requiredName,
|
||||
@Nullable Set<ValueHolder> usedValueHolders) {
|
||||
|
||||
for (ValueHolder valueHolder : this.genericArgumentValues) {
|
||||
if (usedValueHolders != null && usedValueHolders.contains(valueHolder)) {
|
||||
continue;
|
||||
}
|
||||
if (valueHolder.getName() != null && !"".equals(requiredName) &&
|
||||
(requiredName == null || !valueHolder.getName().equals(requiredName))) {
|
||||
if (valueHolder.getName() != null && (requiredName == null ||
|
||||
(!requiredName.isEmpty() && !requiredName.equals(valueHolder.getName())))) {
|
||||
continue;
|
||||
}
|
||||
if (valueHolder.getType() != null &&
|
||||
(requiredType == null || !ClassUtils.matchesTypeName(requiredType, valueHolder.getType()))) {
|
||||
if (valueHolder.getType() != null && (requiredType == null ||
|
||||
!ClassUtils.matchesTypeName(requiredType, valueHolder.getType()))) {
|
||||
continue;
|
||||
}
|
||||
if (requiredType != null && valueHolder.getType() == null && valueHolder.getName() == null &&
|
||||
|
||||
@@ -449,8 +449,8 @@ public class PropertiesBeanDefinitionReader extends AbstractBeanDefinitionReader
|
||||
else if (SINGLETON_KEY.equals(property)) {
|
||||
// Spring 1.2 style
|
||||
String val = StringUtils.trimWhitespace((String) entry.getValue());
|
||||
scope = ("".equals(val) || TRUE_VALUE.equals(val) ? BeanDefinition.SCOPE_SINGLETON :
|
||||
BeanDefinition.SCOPE_PROTOTYPE);
|
||||
scope = (!StringUtils.hasLength(val) || TRUE_VALUE.equals(val) ?
|
||||
BeanDefinition.SCOPE_SINGLETON : BeanDefinition.SCOPE_PROTOTYPE);
|
||||
}
|
||||
else if (LAZY_INIT_KEY.equals(property)) {
|
||||
String val = StringUtils.trimWhitespace((String) entry.getValue());
|
||||
|
||||
@@ -1523,7 +1523,7 @@ public class BeanDefinitionParserDelegate {
|
||||
* Determine whether the given URI indicates the default namespace.
|
||||
*/
|
||||
public boolean isDefaultNamespace(@Nullable String namespaceUri) {
|
||||
return (!StringUtils.hasLength(namespaceUri) || BEANS_NAMESPACE_URI.equals(namespaceUri));
|
||||
return !StringUtils.hasLength(namespaceUri) || BEANS_NAMESPACE_URI.equals(namespaceUri);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1534,7 +1534,7 @@ public class BeanDefinitionParserDelegate {
|
||||
}
|
||||
|
||||
private boolean isDefaultValue(String value) {
|
||||
return (DEFAULT_VALUE.equals(value) || "".equals(value));
|
||||
return !StringUtils.hasLength(value) || DEFAULT_VALUE.equals(value);
|
||||
}
|
||||
|
||||
private boolean isCandidateElement(Node node) {
|
||||
|
||||
@@ -218,7 +218,7 @@ public abstract class AbstractResourceBasedMessageSource extends AbstractMessage
|
||||
* a non-classpath location.
|
||||
*/
|
||||
public void setCacheSeconds(int cacheSeconds) {
|
||||
this.cacheMillis = (cacheSeconds * 1000);
|
||||
this.cacheMillis = cacheSeconds * 1000L;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -146,7 +146,7 @@ public abstract class ExecutorConfigurationSupport extends CustomizableThreadFac
|
||||
* @see java.util.concurrent.ExecutorService#awaitTermination
|
||||
*/
|
||||
public void setAwaitTerminationSeconds(int awaitTerminationSeconds) {
|
||||
this.awaitTerminationMillis = awaitTerminationSeconds * 1000;
|
||||
this.awaitTerminationMillis = awaitTerminationSeconds * 1000L;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2018 the original author or authors.
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -105,7 +105,7 @@ public abstract class AbstractBindingResult extends AbstractErrors implements Bi
|
||||
public void rejectValue(@Nullable String field, String errorCode, @Nullable Object[] errorArgs,
|
||||
@Nullable String defaultMessage) {
|
||||
|
||||
if ("".equals(getNestedPath()) && !StringUtils.hasLength(field)) {
|
||||
if (!StringUtils.hasLength(getNestedPath()) && !StringUtils.hasLength(field)) {
|
||||
// We're at the top of the nested object hierarchy,
|
||||
// so the present level is not a field but rather the top object.
|
||||
// The best we can do is register a global error here...
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2019 the original author or authors.
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -311,7 +311,7 @@ public class SpringValidatorAdapter implements SmartValidator, javax.validation.
|
||||
@Nullable
|
||||
protected Object getRejectedValue(String field, ConstraintViolation<Object> violation, BindingResult bindingResult) {
|
||||
Object invalidValue = violation.getInvalidValue();
|
||||
if (!"".equals(field) && !field.contains("[]") &&
|
||||
if (!field.isEmpty() && !field.contains("[]") &&
|
||||
(invalidValue == violation.getLeafBean() || field.contains("[") || field.contains("."))) {
|
||||
// Possibly a bean constraint with property path: retrieve the actual property value.
|
||||
// However, explicitly avoid this for "address[]" style paths that we can't handle.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2019 the original author or authors.
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -126,7 +126,7 @@ public class SimpleNamingContext implements Context {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Static JNDI lookup: [" + name + "]");
|
||||
}
|
||||
if ("".equals(name)) {
|
||||
if (name.isEmpty()) {
|
||||
return new SimpleNamingContext(this.root, this.boundObjects, this.environment);
|
||||
}
|
||||
Object found = this.boundObjects.get(name);
|
||||
@@ -303,10 +303,10 @@ public class SimpleNamingContext implements Context {
|
||||
|
||||
private abstract static class AbstractNamingEnumeration<T> implements NamingEnumeration<T> {
|
||||
|
||||
private Iterator<T> iterator;
|
||||
private final Iterator<T> iterator;
|
||||
|
||||
private AbstractNamingEnumeration(SimpleNamingContext context, String proot) throws NamingException {
|
||||
if (!"".equals(proot) && !proot.endsWith("/")) {
|
||||
if (!proot.isEmpty() && !proot.endsWith("/")) {
|
||||
proot = proot + "/";
|
||||
}
|
||||
String root = context.root + proot;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2019 the original author or authors.
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -340,7 +340,7 @@ public class PathMatchingResourcePatternResolver implements ResourcePatternResol
|
||||
URL url = resourceUrls.nextElement();
|
||||
result.add(convertClassLoaderURL(url));
|
||||
}
|
||||
if ("".equals(path)) {
|
||||
if (!StringUtils.hasLength(path)) {
|
||||
// The above result is likely to be incomplete, i.e. only containing file system references.
|
||||
// We need to have pointers to each of the jar files on the classpath as well...
|
||||
addAllClassLoaderJarRoots(cl, result);
|
||||
@@ -639,7 +639,7 @@ public class PathMatchingResourcePatternResolver implements ResourcePatternResol
|
||||
if (logger.isTraceEnabled()) {
|
||||
logger.trace("Looking for matching resources in jar file [" + jarFileUrl + "]");
|
||||
}
|
||||
if (!"".equals(rootEntryPath) && !rootEntryPath.endsWith("/")) {
|
||||
if (StringUtils.hasLength(rootEntryPath) && !rootEntryPath.endsWith("/")) {
|
||||
// Root entry path must end with slash to allow for proper matching.
|
||||
// The Sun JRE does not return a slash here, but BEA JRockit does.
|
||||
rootEntryPath = rootEntryPath + "/";
|
||||
|
||||
@@ -331,6 +331,16 @@ public abstract class StringUtils {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if the given {@code String} matches the given single character.
|
||||
* @param str the {@code String} to check
|
||||
* @param singleCharacter the character to compare to
|
||||
* @since 5.2.9
|
||||
*/
|
||||
public static boolean matchesCharacter(@Nullable String str, char singleCharacter) {
|
||||
return (str != null && str.length() == 1 && str.charAt(0) == singleCharacter);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if the given {@code String} starts with the specified prefix,
|
||||
* ignoring upper/lower case.
|
||||
@@ -716,7 +726,7 @@ public abstract class StringUtils {
|
||||
pathElements.add(0, TOP_PATH);
|
||||
}
|
||||
// If nothing else left, at least explicitly point to current path.
|
||||
if (pathElements.size() == 1 && "".equals(pathElements.getLast()) && !prefix.endsWith(FOLDER_SEPARATOR)) {
|
||||
if (pathElements.size() == 1 && pathElements.getLast().isEmpty() && !prefix.endsWith(FOLDER_SEPARATOR)) {
|
||||
pathElements.add(0, CURRENT_PATH);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2018 the original author or authors.
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -255,7 +255,7 @@ abstract class AbstractListenerContainerParser implements BeanDefinitionParser {
|
||||
else if (DESTINATION_TYPE_TOPIC.equals(destinationType)) {
|
||||
pubSubDomain = true;
|
||||
}
|
||||
else if ("".equals(destinationType) || DESTINATION_TYPE_QUEUE.equals(destinationType)) {
|
||||
else if (!StringUtils.hasLength(destinationType) || DESTINATION_TYPE_QUEUE.equals(destinationType)) {
|
||||
// the default: queue
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2018 the original author or authors.
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -64,10 +64,10 @@ class JmsListenerContainerParser extends AbstractListenerContainerParser {
|
||||
|
||||
String containerType = containerEle.getAttribute(CONTAINER_TYPE_ATTRIBUTE);
|
||||
String containerClass = containerEle.getAttribute(CONTAINER_CLASS_ATTRIBUTE);
|
||||
if (!"".equals(containerClass)) {
|
||||
return null; // Not supported
|
||||
if (StringUtils.hasLength(containerClass)) {
|
||||
return null; // not supported
|
||||
}
|
||||
else if ("".equals(containerType) || containerType.startsWith("default")) {
|
||||
else if (!StringUtils.hasLength(containerType) || containerType.startsWith("default")) {
|
||||
factoryDef.setBeanClassName("org.springframework.jms.config.DefaultJmsListenerContainerFactory");
|
||||
}
|
||||
else if (containerType.startsWith("simple")) {
|
||||
@@ -91,10 +91,10 @@ class JmsListenerContainerParser extends AbstractListenerContainerParser {
|
||||
|
||||
String containerType = containerEle.getAttribute(CONTAINER_TYPE_ATTRIBUTE);
|
||||
String containerClass = containerEle.getAttribute(CONTAINER_CLASS_ATTRIBUTE);
|
||||
if (!"".equals(containerClass)) {
|
||||
if (StringUtils.hasLength(containerClass)) {
|
||||
containerDef.setBeanClassName(containerClass);
|
||||
}
|
||||
else if ("".equals(containerType) || containerType.startsWith("default")) {
|
||||
else if (!StringUtils.hasLength(containerType) || containerType.startsWith("default")) {
|
||||
containerDef.setBeanClassName("org.springframework.jms.listener.DefaultMessageListenerContainer");
|
||||
}
|
||||
else if (containerType.startsWith("simple")) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2019 the original author or authors.
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -303,7 +303,7 @@ public class SimpleNamingContext implements Context {
|
||||
|
||||
private abstract static class AbstractNamingEnumeration<T> implements NamingEnumeration<T> {
|
||||
|
||||
private Iterator<T> iterator;
|
||||
private final Iterator<T> iterator;
|
||||
|
||||
private AbstractNamingEnumeration(SimpleNamingContext context, String proot) throws NamingException {
|
||||
if (!proot.isEmpty() && !proot.endsWith("/")) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2019 the original author or authors.
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -235,7 +235,7 @@ class MergedSqlConfig {
|
||||
|
||||
private static String getString(AnnotationAttributes attributes, String attributeName, String defaultValue) {
|
||||
String value = attributes.getString(attributeName);
|
||||
if ("".equals(value)) {
|
||||
if (value.isEmpty()) {
|
||||
value = defaultValue;
|
||||
}
|
||||
return value;
|
||||
|
||||
@@ -64,9 +64,7 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
|
||||
|
||||
/**
|
||||
* Load a Spring ApplicationContext from the supplied {@link MergedContextConfiguration}.
|
||||
*
|
||||
* <p>Implementation details:
|
||||
*
|
||||
* <ul>
|
||||
* <li>Calls {@link #validateMergedContextConfiguration(MergedContextConfiguration)}
|
||||
* to allow subclasses to validate the supplied configuration before proceeding.</li>
|
||||
@@ -98,7 +96,6 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
|
||||
* <li>{@link ConfigurableApplicationContext#refresh Refreshes} the
|
||||
* context and registers a JVM shutdown hook for it.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @return a new application context
|
||||
* @see org.springframework.test.context.SmartContextLoader#loadContext(MergedContextConfiguration)
|
||||
* @see GenericApplicationContext
|
||||
@@ -108,17 +105,17 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
|
||||
public final ConfigurableApplicationContext loadContext(MergedContextConfiguration mergedConfig) throws Exception {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug(String.format("Loading ApplicationContext for merged context configuration [%s].",
|
||||
mergedConfig));
|
||||
mergedConfig));
|
||||
}
|
||||
|
||||
validateMergedContextConfiguration(mergedConfig);
|
||||
|
||||
GenericApplicationContext context = createContext();
|
||||
|
||||
ApplicationContext parent = mergedConfig.getParentApplicationContext();
|
||||
if (parent != null) {
|
||||
context.setParent(parent);
|
||||
}
|
||||
|
||||
prepareContext(context);
|
||||
prepareContext(context, mergedConfig);
|
||||
customizeBeanFactory(context.getDefaultListableBeanFactory());
|
||||
@@ -126,8 +123,10 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
|
||||
AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
|
||||
customizeContext(context);
|
||||
customizeContext(context, mergedConfig);
|
||||
|
||||
context.refresh();
|
||||
context.registerShutdownHook();
|
||||
|
||||
return context;
|
||||
}
|
||||
|
||||
@@ -147,9 +146,7 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
|
||||
|
||||
/**
|
||||
* Load a Spring ApplicationContext from the supplied {@code locations}.
|
||||
*
|
||||
* <p>Implementation details:
|
||||
*
|
||||
* <ul>
|
||||
* <li>Calls {@link #createContext()} to create a {@link GenericApplicationContext}
|
||||
* instance.</li>
|
||||
@@ -168,12 +165,10 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
|
||||
* <li>{@link ConfigurableApplicationContext#refresh Refreshes} the
|
||||
* context and registers a JVM shutdown hook for it.</li>
|
||||
* </ul>
|
||||
*
|
||||
* <p><b>Note</b>: this method does not provide a means to set active bean definition
|
||||
* profiles for the loaded context. See {@link #loadContext(MergedContextConfiguration)}
|
||||
* and {@link AbstractContextLoader#prepareContext(ConfigurableApplicationContext, MergedContextConfiguration)}
|
||||
* for an alternative.
|
||||
*
|
||||
* @return a new application context
|
||||
* @see org.springframework.test.context.ContextLoader#loadContext
|
||||
* @see GenericApplicationContext
|
||||
@@ -184,28 +179,30 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
|
||||
public final ConfigurableApplicationContext loadContext(String... locations) throws Exception {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug(String.format("Loading ApplicationContext for locations [%s].",
|
||||
StringUtils.arrayToCommaDelimitedString(locations)));
|
||||
StringUtils.arrayToCommaDelimitedString(locations)));
|
||||
}
|
||||
|
||||
GenericApplicationContext context = createContext();
|
||||
|
||||
prepareContext(context);
|
||||
customizeBeanFactory(context.getDefaultListableBeanFactory());
|
||||
createBeanDefinitionReader(context).loadBeanDefinitions(locations);
|
||||
AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
|
||||
customizeContext(context);
|
||||
|
||||
context.refresh();
|
||||
context.registerShutdownHook();
|
||||
|
||||
return context;
|
||||
}
|
||||
|
||||
/**
|
||||
* Factory method for creating the {@link GenericApplicationContext} used by
|
||||
* this {@code ContextLoader}.
|
||||
*
|
||||
* <p>The default implementation creates a {@code GenericApplicationContext}
|
||||
* using the default constructor. This method may be overridden in subclasses
|
||||
* — for example, to create a {@code GenericApplicationContext} with
|
||||
* a custom {@link DefaultListableBeanFactory} implementation.
|
||||
*
|
||||
* @return a newly instantiated {@code GenericApplicationContext}
|
||||
* @since 5.2.9
|
||||
*/
|
||||
@@ -216,10 +213,8 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
|
||||
/**
|
||||
* Prepare the {@link GenericApplicationContext} created by this {@code ContextLoader}.
|
||||
* Called <i>before</i> bean definitions are read.
|
||||
*
|
||||
* <p>The default implementation is empty. Can be overridden in subclasses to
|
||||
* customize {@code GenericApplicationContext}'s standard settings.
|
||||
*
|
||||
* @param context the context that should be prepared
|
||||
* @since 2.5
|
||||
* @see #loadContext(MergedContextConfiguration)
|
||||
@@ -235,10 +230,8 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
|
||||
/**
|
||||
* Customize the internal bean factory of the ApplicationContext created by
|
||||
* this {@code ContextLoader}.
|
||||
*
|
||||
* <p>The default implementation is empty but can be overridden in subclasses
|
||||
* to customize {@code DefaultListableBeanFactory}'s standard settings.
|
||||
*
|
||||
* @param beanFactory the bean factory created by this {@code ContextLoader}
|
||||
* @since 2.5
|
||||
* @see #loadContext(MergedContextConfiguration)
|
||||
@@ -254,18 +247,15 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
|
||||
/**
|
||||
* Load bean definitions into the supplied {@link GenericApplicationContext context}
|
||||
* from the locations or classes in the supplied {@code MergedContextConfiguration}.
|
||||
*
|
||||
* <p>The default implementation delegates to the {@link BeanDefinitionReader}
|
||||
* returned by {@link #createBeanDefinitionReader(GenericApplicationContext)} to
|
||||
* {@link BeanDefinitionReader#loadBeanDefinitions(String) load} the
|
||||
* bean definitions.
|
||||
*
|
||||
* <p>Subclasses must provide an appropriate implementation of
|
||||
* {@link #createBeanDefinitionReader(GenericApplicationContext)}. Alternatively subclasses
|
||||
* may provide a <em>no-op</em> implementation of {@code createBeanDefinitionReader()}
|
||||
* and override this method to provide a custom strategy for loading or
|
||||
* registering bean definitions.
|
||||
*
|
||||
* @param context the context into which the bean definitions should be loaded
|
||||
* @param mergedConfig the merged context configuration
|
||||
* @since 3.1
|
||||
@@ -278,7 +268,6 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
|
||||
/**
|
||||
* Factory method for creating a new {@link BeanDefinitionReader} for loading
|
||||
* bean definitions into the supplied {@link GenericApplicationContext context}.
|
||||
*
|
||||
* @param context the context for which the {@code BeanDefinitionReader}
|
||||
* should be created
|
||||
* @return a {@code BeanDefinitionReader} for the supplied context
|
||||
@@ -293,10 +282,8 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
|
||||
* Customize the {@link GenericApplicationContext} created by this
|
||||
* {@code ContextLoader} <i>after</i> bean definitions have been
|
||||
* loaded into the context but <i>before</i> the context is refreshed.
|
||||
*
|
||||
* <p>The default implementation is empty but can be overridden in subclasses
|
||||
* to customize the application context.
|
||||
*
|
||||
* @param context the newly created application context
|
||||
* @since 2.5
|
||||
* @see #loadContext(MergedContextConfiguration)
|
||||
|
||||
@@ -49,7 +49,7 @@ class DefaultRequestPath implements RequestPath {
|
||||
}
|
||||
|
||||
private static PathContainer initContextPath(PathContainer path, @Nullable String contextPath) {
|
||||
if (!StringUtils.hasText(contextPath) || "/".equals(contextPath)) {
|
||||
if (!StringUtils.hasText(contextPath) || StringUtils.matchesCharacter(contextPath, '/')) {
|
||||
return PathContainer.parsePath("");
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ class DefaultRequestPath implements RequestPath {
|
||||
int length = contextPath.length();
|
||||
int counter = 0;
|
||||
|
||||
for (int i=0; i < path.elements().size(); i++) {
|
||||
for (int i = 0; i < path.elements().size(); i++) {
|
||||
PathContainer.Element element = path.elements().get(i);
|
||||
counter += element.value().length();
|
||||
if (length == counter) {
|
||||
|
||||
@@ -233,7 +233,7 @@ public class UrlPathHelper {
|
||||
}
|
||||
// Else, use path within current servlet mapping if applicable
|
||||
String rest = getPathWithinServletMapping(request);
|
||||
if (!"".equals(rest)) {
|
||||
if (StringUtils.hasLength(rest)) {
|
||||
return rest;
|
||||
}
|
||||
else {
|
||||
@@ -415,7 +415,7 @@ public class UrlPathHelper {
|
||||
if (contextPath == null) {
|
||||
contextPath = request.getContextPath();
|
||||
}
|
||||
if ("/".equals(contextPath)) {
|
||||
if (StringUtils.matchesCharacter(contextPath, '/')) {
|
||||
// Invalid case, but happens for includes on Jetty: silently adapt it.
|
||||
contextPath = "";
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2018 the original author or authors.
|
||||
* Copyright 2002-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -76,7 +76,7 @@ class ToStringVisitor implements RouterFunctions.Visitor, RequestPredicates.Visi
|
||||
}
|
||||
|
||||
private void indent() {
|
||||
for (int i=0; i < this.indent; i++) {
|
||||
for (int i = 0; i < this.indent; i++) {
|
||||
this.builder.append(' ');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,6 +38,7 @@ class ToStringVisitor implements RouterFunctions.Visitor, RequestPredicates.Visi
|
||||
|
||||
|
||||
// RouterFunctions.Visitor
|
||||
|
||||
@Override
|
||||
public void startNested(RequestPredicate predicate) {
|
||||
indent();
|
||||
@@ -74,11 +75,12 @@ class ToStringVisitor implements RouterFunctions.Visitor, RequestPredicates.Visi
|
||||
}
|
||||
|
||||
private void indent() {
|
||||
for (int i=0; i < this.indent; i++) {
|
||||
for (int i = 0; i < this.indent; i++) {
|
||||
this.builder.append(' ');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// RequestPredicates.Visitor
|
||||
|
||||
@Override
|
||||
@@ -156,6 +158,7 @@ class ToStringVisitor implements RouterFunctions.Visitor, RequestPredicates.Visi
|
||||
public void unknown(RequestPredicate predicate) {
|
||||
this.builder.append(predicate);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
String result = this.builder.toString();
|
||||
@@ -164,4 +167,5 @@ class ToStringVisitor implements RouterFunctions.Visitor, RequestPredicates.Visi
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.AntPathMatcher;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.servlet.HandlerExecutionChain;
|
||||
import org.springframework.web.servlet.HandlerInterceptor;
|
||||
import org.springframework.web.servlet.HandlerMapping;
|
||||
@@ -145,7 +146,7 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping i
|
||||
// We need to care for the default handler directly, since we need to
|
||||
// expose the PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE for it as well.
|
||||
Object rawHandler = null;
|
||||
if ("/".equals(lookupPath)) {
|
||||
if (StringUtils.matchesCharacter(lookupPath, '/')) {
|
||||
rawHandler = getRootHandler();
|
||||
}
|
||||
if (rawHandler == null) {
|
||||
|
||||
@@ -31,6 +31,7 @@ import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.filter.GenericFilterBean;
|
||||
import org.springframework.web.util.UrlPathHelper;
|
||||
|
||||
@@ -102,7 +103,7 @@ public class ResourceUrlEncodingFilter extends GenericFilterBean {
|
||||
throw new LookupPathIndexException(lookupPath, requestUri);
|
||||
}
|
||||
this.prefixLookupPath = requestUri.substring(0, this.indexLookupPath);
|
||||
if ("/".equals(lookupPath) && !"/".equals(requestUri)) {
|
||||
if (StringUtils.matchesCharacter(lookupPath, '/') && !StringUtils.matchesCharacter(requestUri, '/')) {
|
||||
String contextPath = pathHelper.getContextPath(this);
|
||||
if (requestUri.equals(contextPath)) {
|
||||
this.indexLookupPath = requestUri.length();
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2018 the original author or authors.
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -260,7 +260,7 @@ public class ErrorsTag extends AbstractHtmlElementBodyTag implements BodyTag {
|
||||
@Override
|
||||
protected String autogenerateId() throws JspException {
|
||||
String path = getPropertyPath();
|
||||
if ("".equals(path) || "*".equals(path)) {
|
||||
if (!StringUtils.hasLength(path) || "*".equals(path)) {
|
||||
path = (String) this.pageContext.getAttribute(
|
||||
FormTag.MODEL_ATTRIBUTE_VARIABLE_NAME, PageContext.REQUEST_SCOPE);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user