Polishing

This commit is contained in:
Juergen Hoeller 2017-04-13 15:59:15 +02:00
parent 65d52a4b97
commit a9a1f783c5
22 changed files with 100 additions and 102 deletions

View File

@ -29,8 +29,8 @@ def customizePom(pom, gradleProject) {
} }
licenses { licenses {
license { license {
name "The Apache Software License, Version 2.0" name "Apache License, Version 2.0"
url "http://www.apache.org/licenses/LICENSE-2.0.txt" url "http://www.apache.org/licenses/LICENSE-2.0"
distribution "repo" distribution "repo"
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -39,10 +39,11 @@ public class CacheNamespaceHandler extends NamespaceHandlerSupport {
static final String DEFAULT_CACHE_MANAGER_BEAN_NAME = "cacheManager"; static final String DEFAULT_CACHE_MANAGER_BEAN_NAME = "cacheManager";
static String extractCacheManager(Element element) { static String extractCacheManager(Element element) {
return (element.hasAttribute(CacheNamespaceHandler.CACHE_MANAGER_ATTRIBUTE) ? element return (element.hasAttribute(CacheNamespaceHandler.CACHE_MANAGER_ATTRIBUTE) ?
.getAttribute(CacheNamespaceHandler.CACHE_MANAGER_ATTRIBUTE) element.getAttribute(CacheNamespaceHandler.CACHE_MANAGER_ATTRIBUTE) :
: CacheNamespaceHandler.DEFAULT_CACHE_MANAGER_BEAN_NAME); CacheNamespaceHandler.DEFAULT_CACHE_MANAGER_BEAN_NAME);
} }
static BeanDefinition parseKeyGenerator(Element element, BeanDefinition def) { static BeanDefinition parseKeyGenerator(Element element, BeanDefinition def) {
@ -53,9 +54,11 @@ public class CacheNamespaceHandler extends NamespaceHandlerSupport {
return def; return def;
} }
@Override @Override
public void init() { public void init() {
registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenCacheBeanDefinitionParser()); registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenCacheBeanDefinitionParser());
registerBeanDefinitionParser("advice", new CacheAdviceParser()); registerBeanDefinitionParser("advice", new CacheAdviceParser());
} }
} }

View File

@ -390,7 +390,7 @@ public @interface Configuration {
/** /**
* Explicitly specify the name of the Spring bean definition associated * Explicitly specify the name of the Spring bean definition associated
* with this Configuration class. If left unspecified (the common case), * with this Configuration class. If left unspecified (the common case),
* a bean name will be automatically generated. * a bean name will be automatically generated.
* <p>The custom name applies only if the Configuration class is picked up via * <p>The custom name applies only if the Configuration class is picked up via
* component scanning or supplied directly to a {@link AnnotationConfigApplicationContext}. * component scanning or supplied directly to a {@link AnnotationConfigApplicationContext}.

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -256,8 +256,8 @@ public abstract class AbstractApplicationEventMulticaster
* for the given event type * for the given event type
*/ */
protected boolean supportsEvent(Class<?> listenerType, ResolvableType eventType) { protected boolean supportsEvent(Class<?> listenerType, ResolvableType eventType) {
if (GenericApplicationListener.class.isAssignableFrom(listenerType) if (GenericApplicationListener.class.isAssignableFrom(listenerType) ||
|| SmartApplicationListener.class.isAssignableFrom(listenerType)) { SmartApplicationListener.class.isAssignableFrom(listenerType)) {
return true; return true;
} }
ResolvableType declaredEventType = GenericApplicationListenerAdapter.resolveDeclaredEventType(listenerType); ResolvableType declaredEventType = GenericApplicationListenerAdapter.resolveDeclaredEventType(listenerType);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2015 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -79,6 +79,7 @@ public interface ApplicationEventMulticaster {
* based on the {@code event} instance. * based on the {@code event} instance.
* @param event the event to multicast * @param event the event to multicast
* @param eventType the type of event (can be null) * @param eventType the type of event (can be null)
* @since 4.2
*/ */
void multicastEvent(ApplicationEvent event, ResolvableType eventType); void multicastEvent(ApplicationEvent event, ResolvableType eventType);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -145,7 +145,7 @@ public class EventListenerMethodProcessor implements SmartInitializingSingleton,
if (CollectionUtils.isEmpty(annotatedMethods)) { if (CollectionUtils.isEmpty(annotatedMethods)) {
this.nonAnnotatedClasses.add(targetType); this.nonAnnotatedClasses.add(targetType);
if (logger.isTraceEnabled()) { if (logger.isTraceEnabled()) {
logger.trace("No @EventListener annotations found on bean class: " + targetType); logger.trace("No @EventListener annotations found on bean class: " + targetType.getName());
} }
} }
else { else {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -23,10 +23,10 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import java.lang.annotation.Target;
/** /**
* Declares that a field should be formatted as a date time. * Declares that a field or method parameter should be formatted as a date or time.
* *
* <p>Supports formatting by style pattern, ISO date time pattern, or custom format pattern string. * <p>Supports formatting by style pattern, ISO date time pattern, or custom format pattern string.
* Can be applied to {@code java.util.Date}, {@code java.util.Calendar}, {@code java.long.Long}, * Can be applied to {@code java.util.Date}, {@code java.util.Calendar}, {@code java.lang.Long},
* Joda-Time value types; and as of Spring 4 and JDK 8, to JSR-310 <code>java.time</code> types too. * Joda-Time value types; and as of Spring 4 and JDK 8, to JSR-310 <code>java.time</code> types too.
* *
* <p>For style-based formatting, set the {@link #style} attribute to be the style pattern code. * <p>For style-based formatting, set the {@link #style} attribute to be the style pattern code.
@ -35,7 +35,7 @@ import java.lang.annotation.Target;
* A date or time may be omitted by specifying the style character '-'. * A date or time may be omitted by specifying the style character '-'.
* *
* <p>For ISO-based formatting, set the {@link #iso} attribute to be the desired {@link ISO} format, * <p>For ISO-based formatting, set the {@link #iso} attribute to be the desired {@link ISO} format,
* such as {@link ISO#DATE}. For custom formatting, set the {@link #pattern()} attribute to be the * such as {@link ISO#DATE}. For custom formatting, set the {@link #pattern} attribute to be the
* DateTime pattern, such as {@code yyyy/MM/dd hh:mm:ss a}. * DateTime pattern, such as {@code yyyy/MM/dd hh:mm:ss a}.
* *
* <p>Each attribute is mutually exclusive, so only set one attribute per annotation instance * <p>Each attribute is mutually exclusive, so only set one attribute per annotation instance
@ -64,7 +64,7 @@ public @interface DateTimeFormat {
/** /**
* The ISO pattern to use to format the field. * The ISO pattern to use to format the field.
* The possible ISO patterns are defined in the {@link ISO} enum. * <p>The possible ISO patterns are defined in the {@link ISO} enum.
* <p>Defaults to {@link ISO#NONE}, indicating this attribute should be ignored. * <p>Defaults to {@link ISO#NONE}, indicating this attribute should be ignored.
* Set this attribute when you wish to format your field in accordance with an ISO format. * Set this attribute when you wish to format your field in accordance with an ISO format.
*/ */

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2015 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -23,7 +23,7 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import java.lang.annotation.Target;
/** /**
* Declares that a field should be formatted as a number. * Declares that a field or method parameter should be formatted as a number.
* *
* <p>Supports formatting by style or custom pattern string. * <p>Supports formatting by style or custom pattern string.
* Can be applied to any JDK {@code java.lang.Number} type. * Can be applied to any JDK {@code java.lang.Number} type.
@ -37,7 +37,7 @@ import java.lang.annotation.Target;
* When the {@link #pattern} attribute is specified, it takes precedence over * When the {@link #pattern} attribute is specified, it takes precedence over
* the {@link #style} attribute. When no annotation attributes are specified, * the {@link #style} attribute. When no annotation attributes are specified,
* the default format applied is style-based for either number of currency, * the default format applied is style-based for either number of currency,
* depending on the annotated field type. * depending on the annotated field or method parameter type.
* *
* @author Keith Donald * @author Keith Donald
* @author Juergen Hoeller * @author Juergen Hoeller

View File

@ -1,6 +1,6 @@
/** /**
* Spring's repackaging of * Spring's repackaging of
* <a href="http://asm.ow2.org">org.objectweb.asm 5.0</a> * <a href="http://asm.ow2.org">ASM</a>
* (for internal use only). * (for internal use only).
* *
* <p>This repackaging technique avoids any potential conflicts with * <p>This repackaging technique avoids any potential conflicts with
@ -8,8 +8,6 @@
* libraries and frameworks. * libraries and frameworks.
* *
* <p>As this repackaging happens at the class file level, sources * <p>As this repackaging happens at the class file level, sources
* and javadocs are not available here. See the original ObjectWeb * and javadocs are not available here.
* <a href="http://asm.ow2.org/asm50/javadoc/user">ASM 5.0 javadocs</a>
* for details when working with these classes.
*/ */
package org.springframework.asm; package org.springframework.asm;

View File

@ -1,6 +1,6 @@
/** /**
* Spring's repackaging of * Spring's repackaging of
* <a href="http://cglib.sourceforge.net">net.sf.cglib 3.2</a> * <a href="http://cglib.sourceforge.net">CGLIB</a>
* (for internal use only). * (for internal use only).
* *
* <p>This repackaging technique avoids any potential conflicts with * <p>This repackaging technique avoids any potential conflicts with
@ -8,8 +8,6 @@
* libraries and frameworks. * libraries and frameworks.
* *
* <p>As this repackaging happens at the class file level, sources * <p>As this repackaging happens at the class file level, sources
* and javadocs are not available here. See the original * and javadocs are not available here.
* <a href="http://cglib.sourceforge.net/apidocs">CGLIB 3.2 javadocs</a>
* for details when working with these classes.
*/ */
package org.springframework.cglib; package org.springframework.cglib;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -57,7 +57,7 @@ final class CollectionToObjectConverter implements ConditionalGenericConverter {
return source; return source;
} }
Collection<?> sourceCollection = (Collection<?>) source; Collection<?> sourceCollection = (Collection<?>) source;
if (sourceCollection.size() == 0) { if (sourceCollection.isEmpty()) {
return null; return null;
} }
Object firstElement = sourceCollection.iterator().next(); Object firstElement = sourceCollection.iterator().next();

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2015 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -154,7 +154,7 @@ public class PathMatchingResourcePatternResolverTests {
private void assertFilenameIn(Resource resource, String... filenames) { private void assertFilenameIn(Resource resource, String... filenames) {
String filename = resource.getFilename(); String filename = resource.getFilename();
assertTrue(resource + " does not have a filename that matches any of the specified names", assertTrue(resource + " does not have a filename that matches any of the specified names",
Arrays.stream(filenames).anyMatch(filename::endsWith)); Arrays.stream(filenames).anyMatch(filename::endsWith));
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -168,11 +168,11 @@ public abstract class ScriptUtils {
String blockCommentStartDelimiter, String blockCommentEndDelimiter, List<String> statements) String blockCommentStartDelimiter, String blockCommentEndDelimiter, List<String> statements)
throws ScriptException { throws ScriptException {
Assert.hasText(script, "script must not be null or empty"); Assert.hasText(script, "'script' must not be null or empty");
Assert.notNull(separator, "separator must not be null"); Assert.notNull(separator, "'separator' must not be null");
Assert.hasText(commentPrefix, "commentPrefix must not be null or empty"); Assert.hasText(commentPrefix, "'commentPrefix' must not be null or empty");
Assert.hasText(blockCommentStartDelimiter, "blockCommentStartDelimiter must not be null or empty"); Assert.hasText(blockCommentStartDelimiter, "'blockCommentStartDelimiter' must not be null or empty");
Assert.hasText(blockCommentEndDelimiter, "blockCommentEndDelimiter must not be null or empty"); Assert.hasText(blockCommentEndDelimiter, "'blockCommentEndDelimiter' must not be null or empty");
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
boolean inSingleQuote = false; boolean inSingleQuote = false;
@ -199,7 +199,7 @@ public abstract class ScriptUtils {
} }
if (!inSingleQuote && !inDoubleQuote) { if (!inSingleQuote && !inDoubleQuote) {
if (script.startsWith(separator, i)) { if (script.startsWith(separator, i)) {
// we've reached the end of the current statement // We've reached the end of the current statement
if (sb.length() > 0) { if (sb.length() > 0) {
statements.add(sb.toString()); statements.add(sb.toString());
sb = new StringBuilder(); sb = new StringBuilder();
@ -208,32 +208,31 @@ public abstract class ScriptUtils {
continue; continue;
} }
else if (script.startsWith(commentPrefix, i)) { else if (script.startsWith(commentPrefix, i)) {
// skip over any content from the start of the comment to the EOL // Skip over any content from the start of the comment to the EOL
int indexOfNextNewline = script.indexOf("\n", i); int indexOfNextNewline = script.indexOf("\n", i);
if (indexOfNextNewline > i) { if (indexOfNextNewline > i) {
i = indexOfNextNewline; i = indexOfNextNewline;
continue; continue;
} }
else { else {
// if there's no EOL, we must be at the end // If there's no EOL, we must be at the end of the script, so stop here.
// of the script, so stop here.
break; break;
} }
} }
else if (script.startsWith(blockCommentStartDelimiter, i)) { else if (script.startsWith(blockCommentStartDelimiter, i)) {
// skip over any block comments // Skip over any block comments
int indexOfCommentEnd = script.indexOf(blockCommentEndDelimiter, i); int indexOfCommentEnd = script.indexOf(blockCommentEndDelimiter, i);
if (indexOfCommentEnd > i) { if (indexOfCommentEnd > i) {
i = indexOfCommentEnd + blockCommentEndDelimiter.length() - 1; i = indexOfCommentEnd + blockCommentEndDelimiter.length() - 1;
continue; continue;
} }
else { else {
throw new ScriptParseException(String.format("Missing block comment end delimiter [%s].", throw new ScriptParseException(
blockCommentEndDelimiter), resource); "Missing block comment end delimiter: " + blockCommentEndDelimiter, resource);
} }
} }
else if (c == ' ' || c == '\n' || c == '\t') { else if (c == ' ' || c == '\n' || c == '\t') {
// avoid multiple adjacent whitespace characters // Avoid multiple adjacent whitespace characters
if (sb.length() > 0 && sb.charAt(sb.length() - 1) != ' ') { if (sb.length() > 0 && sb.charAt(sb.length() - 1) != ' ') {
c = ' '; c = ' ';
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -395,12 +395,7 @@ public class FormHttpMessageConverter implements HttpMessageConverter<MultiValue
* or a newly built {@link HttpEntity} wrapper for that part * or a newly built {@link HttpEntity} wrapper for that part
*/ */
protected HttpEntity<?> getHttpEntity(Object part) { protected HttpEntity<?> getHttpEntity(Object part) {
if (part instanceof HttpEntity) { return (part instanceof HttpEntity ? (HttpEntity<?>) part : new HttpEntity<Object>(part));
return (HttpEntity<?>) part;
}
else {
return new HttpEntity<Object>(part);
}
} }
/** /**
@ -415,7 +410,7 @@ public class FormHttpMessageConverter implements HttpMessageConverter<MultiValue
if (part instanceof Resource) { if (part instanceof Resource) {
Resource resource = (Resource) part; Resource resource = (Resource) part;
String filename = resource.getFilename(); String filename = resource.getFilename();
if (this.multipartCharset != null) { if (filename != null && this.multipartCharset != null) {
filename = MimeDelegate.encode(filename, this.multipartCharset.name()); filename = MimeDelegate.encode(filename, this.multipartCharset.name());
} }
return filename; return filename;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2015 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -67,14 +67,14 @@ public interface GenericHttpMessageConverter<T> extends HttpMessageConverter<T>
/** /**
* Indicates whether the given class can be written by this converter. * Indicates whether the given class can be written by this converter.
* This method should perform the same checks than * <p>This method should perform the same checks than
* {@link HttpMessageConverter#canWrite(Class, MediaType)} with additional ones * {@link HttpMessageConverter#canWrite(Class, MediaType)} with additional ones
* related to the generic type. * related to the generic type.
* @param type the (potentially generic) type to test for writability, can be * @param type the (potentially generic) type to test for writability
* {@code null} if not specified. * (can be {@code null} if not specified)
* @param clazz the source object class to test for writability * @param clazz the source object class to test for writability
* @param mediaType the media type to write, can be {@code null} if not specified. * @param mediaType the media type to write (can be {@code null} if not specified);
* Typically the value of an {@code Accept} header. * typically the value of an {@code Accept} header.
* @return {@code true} if writable; {@code false} otherwise * @return {@code true} if writable; {@code false} otherwise
* @since 4.2 * @since 4.2
*/ */

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2010 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -35,8 +35,8 @@ public interface HttpMessageConverter<T> {
/** /**
* Indicates whether the given class can be read by this converter. * Indicates whether the given class can be read by this converter.
* @param clazz the class to test for readability * @param clazz the class to test for readability
* @param mediaType the media type to read, can be {@code null} if not specified. * @param mediaType the media type to read (can be {@code null} if not specified);
* Typically the value of a {@code Content-Type} header. * typically the value of a {@code Content-Type} header.
* @return {@code true} if readable; {@code false} otherwise * @return {@code true} if readable; {@code false} otherwise
*/ */
boolean canRead(Class<?> clazz, MediaType mediaType); boolean canRead(Class<?> clazz, MediaType mediaType);
@ -44,8 +44,8 @@ public interface HttpMessageConverter<T> {
/** /**
* Indicates whether the given class can be written by this converter. * Indicates whether the given class can be written by this converter.
* @param clazz the class to test for writability * @param clazz the class to test for writability
* @param mediaType the media type to write, can be {@code null} if not specified. * @param mediaType the media type to write (can be {@code null} if not specified);
* Typically the value of an {@code Accept} header. * typically the value of an {@code Accept} header.
* @return {@code true} if writable; {@code false} otherwise * @return {@code true} if writable; {@code false} otherwise
*/ */
boolean canWrite(Class<?> clazz, MediaType mediaType); boolean canWrite(Class<?> clazz, MediaType mediaType);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2014 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -24,7 +24,6 @@ import com.google.gson.GsonBuilder;
import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
/** /**
* A {@link FactoryBean} for creating a Google Gson 2.x {@link Gson} instance. * A {@link FactoryBean} for creating a Google Gson 2.x {@link Gson} instance.
* *

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2015 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -187,10 +187,9 @@ public class Jaxb2CollectionHttpMessageConverter<T extends Collection>
try { try {
return (T) collectionClass.newInstance(); return (T) collectionClass.newInstance();
} }
catch (Exception ex) { catch (Throwable ex) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"Could not instantiate collection class [" + "Could not instantiate collection class: " + collectionClass.getName(), ex);
collectionClass.getName() + "]: " + ex.getMessage());
} }
} }
else if (List.class == collectionClass) { else if (List.class == collectionClass) {
@ -230,6 +229,7 @@ public class Jaxb2CollectionHttpMessageConverter<T extends Collection>
@Override @Override
public void write(T t, Type type, MediaType contentType, HttpOutputMessage outputMessage) public void write(T t, Type type, MediaType contentType, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException { throws IOException, HttpMessageNotWritableException {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -71,6 +71,7 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
private final UrlPathHelper pathHelper; private final UrlPathHelper pathHelper;
public ForwardedHeaderFilter() { public ForwardedHeaderFilter() {
this.pathHelper = new UrlPathHelper(); this.pathHelper = new UrlPathHelper();
this.pathHelper.setUrlDecode(false); this.pathHelper.setUrlDecode(false);
@ -143,8 +144,7 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
String prefix = getForwardedPrefix(request); String prefix = getForwardedPrefix(request);
this.contextPath = (prefix != null ? prefix : request.getContextPath()); this.contextPath = (prefix != null ? prefix : request.getContextPath());
this.requestUri = this.contextPath + pathHelper.getPathWithinApplication(request); this.requestUri = this.contextPath + pathHelper.getPathWithinApplication(request);
this.requestUrl = this.scheme + "://" + this.host + this.requestUrl = this.scheme + "://" + this.host + (port == -1 ? "" : ":" + port) + this.requestUri;
(port == -1 ? "" : ":" + port) + this.requestUri;
this.headers = initHeaders(request); this.headers = initHeaders(request);
} }
@ -235,13 +235,13 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
} }
} }
private static class ForwardedHeaderResponseWrapper extends HttpServletResponseWrapper { private static class ForwardedHeaderResponseWrapper extends HttpServletResponseWrapper {
private static final String FOLDER_SEPARATOR = "/"; private static final String FOLDER_SEPARATOR = "/";
private final HttpServletRequest request; private final HttpServletRequest request;
public ForwardedHeaderResponseWrapper(HttpServletResponse response, HttpServletRequest request) { public ForwardedHeaderResponseWrapper(HttpServletResponse response, HttpServletRequest request) {
super(response); super(response);
this.request = request; this.request = request;
@ -249,7 +249,6 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
@Override @Override
public void sendRedirect(String location) throws IOException { public void sendRedirect(String location) throws IOException {
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(location); UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(location);
// Absolute location // Absolute location
@ -259,20 +258,15 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
} }
// Network-path reference // Network-path reference
if(location.startsWith("//")) { if (location.startsWith("//")) {
String scheme = this.request.getScheme(); String scheme = this.request.getScheme();
super.sendRedirect(builder.scheme(scheme).toUriString()); super.sendRedirect(builder.scheme(scheme).toUriString());
return; return;
} }
// Relative to Servlet container root or to current request // Relative to Servlet container root or to current request
String path; String path = (location.startsWith(FOLDER_SEPARATOR) ? location :
if (location.startsWith(FOLDER_SEPARATOR)) { StringUtils.applyRelativePath(this.request.getRequestURI(), location));
path = location;
}
else {
path = StringUtils.applyRelativePath(this.request.getRequestURI(), location);
}
String result = UriComponentsBuilder String result = UriComponentsBuilder
.fromHttpRequest(new ServletServerHttpRequest(this.request)) .fromHttpRequest(new ServletServerHttpRequest(this.request))

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -99,7 +99,7 @@ public class MappingJackson2HttpMessageConverterTests {
assertEquals("Foo", result.get("string")); assertEquals("Foo", result.get("string"));
assertEquals(42, result.get("number")); assertEquals(42, result.get("number"));
assertEquals(42D, (Double) result.get("fraction"), 0D); assertEquals(42D, (Double) result.get("fraction"), 0D);
List<String> array = new ArrayList<String>(); List<String> array = new ArrayList<>();
array.add("Foo"); array.add("Foo");
array.add("Bar"); array.add("Bar");
assertEquals(array, result.get("array")); assertEquals(array, result.get("array"));
@ -162,7 +162,6 @@ public class MappingJackson2HttpMessageConverterTests {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void readGenerics() throws IOException { public void readGenerics() throws IOException {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter() { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter() {
@Override @Override
protected JavaType getJavaType(Type type, Class<?> contextClass) { protected JavaType getJavaType(Type type, Class<?> contextClass) {
if (type instanceof Class && List.class.isAssignableFrom((Class<?>)type)) { if (type instanceof Class && List.class.isAssignableFrom((Class<?>)type)) {
@ -451,9 +450,9 @@ public class MappingJackson2HttpMessageConverterTests {
} }
private interface MyJacksonView1 {}; private interface MyJacksonView1 {}
private interface MyJacksonView2 {}; private interface MyJacksonView2 {}
@SuppressWarnings("unused") @SuppressWarnings("unused")

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -89,7 +89,7 @@ public class ModelAndView {
} }
/** /**
* Creates new ModelAndView given a view name and a model. * Create a new ModelAndView given a view name and a model.
* @param viewName name of the View to render, to be resolved * @param viewName name of the View to render, to be resolved
* by the DispatcherServlet's ViewResolver * by the DispatcherServlet's ViewResolver
* @param model Map of model names (Strings) to model objects * @param model Map of model names (Strings) to model objects
@ -104,7 +104,7 @@ public class ModelAndView {
} }
/** /**
* Creates new ModelAndView given a View object and a model. * Create a new ModelAndView given a View object and a model.
* <emphasis>Note: the supplied model data is copied into the internal * <emphasis>Note: the supplied model data is copied into the internal
* storage of this class. You should not consider to modify the supplied * storage of this class. You should not consider to modify the supplied
* Map after supplying it to this class</emphasis> * Map after supplying it to this class</emphasis>
@ -121,14 +121,27 @@ public class ModelAndView {
} }
/** /**
* Creates new ModelAndView given a view name, model, and status. * Create a new ModelAndView given a view name and HTTP status.
* @param viewName name of the View to render, to be resolved
* by the DispatcherServlet's ViewResolver
* @param status an HTTP status code to use for the response
* (to be set just prior to View rendering)
* @since 4.3.8
*/
public ModelAndView(String viewName, HttpStatus status) {
this.view = viewName;
this.status = status;
}
/**
* Create a new ModelAndView given a view name, model, and HTTP status.
* @param viewName name of the View to render, to be resolved * @param viewName name of the View to render, to be resolved
* by the DispatcherServlet's ViewResolver * by the DispatcherServlet's ViewResolver
* @param model Map of model names (Strings) to model objects * @param model Map of model names (Strings) to model objects
* (Objects). Model entries may not be {@code null}, but the * (Objects). Model entries may not be {@code null}, but the
* model Map may be {@code null} if there is no model data. * model Map may be {@code null} if there is no model data.
* @param status an alternative status code to use for the response; * @param status an HTTP status code to use for the response
* The response status is set just prior to View rendering. * (to be set just prior to View rendering)
* @since 4.3 * @since 4.3
*/ */
public ModelAndView(String viewName, Map<String, ?> model, HttpStatus status) { public ModelAndView(String viewName, Map<String, ?> model, HttpStatus status) {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.web.servlet.mvc.method.annotation; package org.springframework.web.servlet.mvc.method.annotation;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@ -34,13 +35,11 @@ import org.springframework.web.context.request.async.StandardServletAsyncWebRequ
import org.springframework.web.context.request.async.WebAsyncUtils; import org.springframework.web.context.request.async.WebAsyncUtils;
import org.springframework.web.method.support.ModelAndViewContainer; import org.springframework.web.method.support.ModelAndViewContainer;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.*;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
/** /**
* Unit tests for {@link DeferredResultMethodReturnValueHandler}. * Unit tests for {@link DeferredResultMethodReturnValueHandler}.
*
* @author Rossen Stoyanchev * @author Rossen Stoyanchev
*/ */
public class DeferredResultReturnValueHandlerTests { public class DeferredResultReturnValueHandlerTests {
@ -53,7 +52,7 @@ public class DeferredResultReturnValueHandlerTests {
@Before @Before
public void setUp() throws Exception { public void setup() throws Exception {
this.handler = new DeferredResultMethodReturnValueHandler(); this.handler = new DeferredResultMethodReturnValueHandler();
this.request = new MockHttpServletRequest(); this.request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse(); MockHttpServletResponse response = new MockHttpServletResponse();