提交 e8ef3654 编写于 作者: J Juergen Hoeller

Polishing

上级 04348901
......@@ -244,7 +244,6 @@ public abstract class HttpRange {
this.suffixLength = suffixLength;
}
@Override
public long getRangeStart(long length) {
if (this.suffixLength < length) {
......
......@@ -117,6 +117,7 @@ class OkHttpClientHttpRequest extends AbstractBufferingAsyncClientHttpRequest
}
}
private static class OkHttpListenableFuture extends SettableListenableFuture<ClientHttpResponse> {
private final Call call;
......@@ -124,12 +125,10 @@ class OkHttpClientHttpRequest extends AbstractBufferingAsyncClientHttpRequest
public OkHttpListenableFuture(Call call) {
this.call = call;
this.call.enqueue(new Callback() {
@Override
public void onResponse(Response response) {
set(new OkHttpClientHttpResponse(response));
}
@Override
public void onFailure(Request request, IOException ex) {
setException(ex);
......
......@@ -112,4 +112,5 @@ public class OkHttpClientHttpRequestFactory
this.client.getDispatcher().getExecutorService().shutdown();
}
}
}
......@@ -25,8 +25,7 @@ import org.springframework.http.HttpHeaders;
import org.springframework.util.Assert;
/**
* {@link org.springframework.http.client.ClientHttpResponse} implementation that uses
* OkHttp.
* {@link ClientHttpResponse} implementation based on OkHttp.
*
* @author Luciano Leggieri
* @author Arjen Poutsma
......@@ -80,7 +79,8 @@ class OkHttpClientHttpResponse extends AbstractClientHttpResponse {
this.response.body().close();
}
catch (IOException ex) {
// Ignore
// ignore
}
}
}
......@@ -57,6 +57,7 @@ public abstract class AbstractGenericHttpMessageConverter<T> extends AbstractHtt
super(supportedMediaTypes);
}
@Override
public boolean canRead(Type type, Class<?> contextClass, MediaType mediaType) {
return canRead(contextClass, mediaType);
......@@ -78,8 +79,7 @@ public abstract class AbstractGenericHttpMessageConverter<T> extends AbstractHtt
addDefaultHeaders(headers, t, contentType);
if (outputMessage instanceof StreamingHttpOutputMessage) {
StreamingHttpOutputMessage streamingOutputMessage =
(StreamingHttpOutputMessage) outputMessage;
StreamingHttpOutputMessage streamingOutputMessage = (StreamingHttpOutputMessage) outputMessage;
streamingOutputMessage.setBody(new StreamingHttpOutputMessage.Body() {
@Override
public void writeTo(final OutputStream outputStream) throws IOException {
......@@ -106,6 +106,7 @@ public abstract class AbstractGenericHttpMessageConverter<T> extends AbstractHtt
@Override
protected void writeInternal(T t, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
writeInternal(t, null, outputMessage);
}
......
......@@ -201,9 +201,7 @@ public abstract class AbstractHttpMessageConverter<T> implements HttpMessageConv
* type was not provided, calls {@link #getContentLength}, and sets the corresponding headers
* @since 4.2
*/
protected void addDefaultHeaders(final HttpHeaders headers, final T t, MediaType contentType)
throws IOException{
protected void addDefaultHeaders(HttpHeaders headers, T t, MediaType contentType) throws IOException{
if (headers.getContentType() == null) {
MediaType contentTypeToUse = contentType;
if (contentType == null || contentType.isWildcardType() || contentType.isWildcardSubtype()) {
......
......@@ -88,18 +88,6 @@ public class UnsatisfiedServletRequestParameterException extends ServletRequestB
return sb.toString();
}
private static String requestParameterMapToString(Map<String, String[]> actualParams) {
StringBuilder result = new StringBuilder();
for (Iterator<Map.Entry<String, String[]>> it = actualParams.entrySet().iterator(); it.hasNext();) {
Map.Entry<String, String[]> entry = it.next();
result.append(entry.getKey()).append('=').append(ObjectUtils.nullSafeToString(entry.getValue()));
if (it.hasNext()) {
result.append(", ");
}
}
return result.toString();
}
/**
* Return the parameter conditions that have been violated or the first group
* in case of multiple groups.
......@@ -126,4 +114,17 @@ public class UnsatisfiedServletRequestParameterException extends ServletRequestB
return this.actualParams;
}
private static String requestParameterMapToString(Map<String, String[]> actualParams) {
StringBuilder result = new StringBuilder();
for (Iterator<Map.Entry<String, String[]>> it = actualParams.entrySet().iterator(); it.hasNext();) {
Map.Entry<String, String[]> entry = it.next();
result.append(entry.getKey()).append('=').append(ObjectUtils.nullSafeToString(entry.getValue()));
if (it.hasNext()) {
result.append(", ");
}
}
return result.toString();
}
}
......@@ -116,7 +116,9 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe
* @param asyncRequestFactory the asynchronous request factory
* @param syncRequestFactory the synchronous request factory
*/
public AsyncRestTemplate(AsyncClientHttpRequestFactory asyncRequestFactory, ClientHttpRequestFactory syncRequestFactory) {
public AsyncRestTemplate(
AsyncClientHttpRequestFactory asyncRequestFactory, ClientHttpRequestFactory syncRequestFactory) {
this(asyncRequestFactory, new RestTemplate(syncRequestFactory));
}
......@@ -127,7 +129,7 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe
* @param restTemplate the synchronous template to use
*/
public AsyncRestTemplate(AsyncClientHttpRequestFactory requestFactory, RestTemplate restTemplate) {
Assert.notNull(restTemplate, "'restTemplate' must not be null");
Assert.notNull(restTemplate, "RestTemplate must not be null");
this.syncTemplate = restTemplate;
setAsyncRequestFactory(requestFactory);
}
......@@ -142,7 +144,9 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe
this.syncTemplate.setErrorHandler(errorHandler);
}
/** Return the error handler. */
/**
* Return the error handler.
*/
public ResponseErrorHandler getErrorHandler() {
return this.syncTemplate.getErrorHandler();
}
......@@ -180,7 +184,7 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe
* Return the message body converters.
*/
public List<HttpMessageConverter<?>> getMessageConverters() {
return syncTemplate.getMessageConverters();
return this.syncTemplate.getMessageConverters();
}
......@@ -232,6 +236,7 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe
return execute(url, HttpMethod.HEAD, null, headersExtractor);
}
// POST
@Override
......
......@@ -190,7 +190,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat
* @since 3.2.7
*/
public RestTemplate(List<HttpMessageConverter<?>> messageConverters) {
Assert.notEmpty(messageConverters, "'messageConverters' must not be empty");
Assert.notEmpty(messageConverters, "At least one HttpMessageConverter required");
this.messageConverters.addAll(messageConverters);
}
......@@ -200,7 +200,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat
* <p>These converters are used to convert from and to HTTP requests and responses.
*/
public void setMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
Assert.notEmpty(messageConverters, "'messageConverters' must not be empty");
Assert.notEmpty(messageConverters, "At least one HttpMessageConverter required");
// Take getMessageConverters() List as-is when passed in here
if (this.messageConverters != messageConverters) {
this.messageConverters.clear();
......@@ -220,7 +220,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat
* <p>By default, RestTemplate uses a {@link DefaultResponseErrorHandler}.
*/
public void setErrorHandler(ResponseErrorHandler errorHandler) {
Assert.notNull(errorHandler, "'errorHandler' must not be null");
Assert.notNull(errorHandler, "ResponseErrorHandler must not be null");
this.errorHandler = errorHandler;
}
......@@ -237,7 +237,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat
* @param handler the URI template handler to use
*/
public void setUriTemplateHandler(UriTemplateHandler handler) {
Assert.notNull(handler, "'uriTemplateHandler' is required.");
Assert.notNull(handler, "UriTemplateHandler must not be null");
this.uriTemplateHandler = handler;
}
......
......@@ -74,6 +74,7 @@ public class CorsConfiguration {
this.maxAge = other.maxAge;
}
/**
* Combine the supplied {@code CorsConfiguration} with this one.
* <p>Properties of this configuration are overridden by any non-null
......@@ -113,13 +114,23 @@ public class CorsConfiguration {
return combined;
}
/**
* Set the origins to allow, e.g. {@code "http://domain1.com"}.
* <p>The special value {@code "*"} allows all domains.
* <p>By default this is not set.
*/
public void setAllowedOrigins(List<String> allowedOrigins) {
this.allowedOrigins = (allowedOrigins == null ? null : new ArrayList<String>(allowedOrigins));
this.allowedOrigins = (allowedOrigins != null ? new ArrayList<String>(allowedOrigins) : null);
}
/**
* Return the configured origins to allow, possibly {@code null}.
* @see #addAllowedOrigin(String)
* @see #setAllowedOrigins(List)
*/
public List<String> getAllowedOrigins() {
return this.allowedOrigins;
}
/**
......@@ -132,15 +143,6 @@ public class CorsConfiguration {
this.allowedOrigins.add(origin);
}
/**
* Return the configured origins to allow, possibly {@code null}.
* @see #addAllowedOrigin(String)
* @see #setAllowedOrigins(List)
*/
public List<String> getAllowedOrigins() {
return this.allowedOrigins;
}
/**
* Set the HTTP methods to allow, e.g. {@code "GET"}, {@code "POST"},
* {@code "PUT"}, etc.
......@@ -149,7 +151,18 @@ public class CorsConfiguration {
* <p>By default this is not set.
*/
public void setAllowedMethods(List<String> allowedMethods) {
this.allowedMethods = (allowedMethods == null ? null : new ArrayList<String>(allowedMethods));
this.allowedMethods = (allowedMethods != null ? new ArrayList<String>(allowedMethods) : null);
}
/**
* Return the allowed HTTP methods, possibly {@code null} in which case
* only {@code "GET"} is allowed.
* @see #addAllowedMethod(HttpMethod)
* @see #addAllowedMethod(String)
* @see #setAllowedMethods(List)
*/
public List<String> getAllowedMethods() {
return this.allowedMethods;
}
/**
......@@ -173,17 +186,6 @@ public class CorsConfiguration {
}
}
/**
* Return the allowed HTTP methods, possibly {@code null} in which case
* only {@code "GET"} is allowed.
* @see #addAllowedMethod(HttpMethod)
* @see #addAllowedMethod(String)
* @see #setAllowedMethods(List)
*/
public List<String> getAllowedMethods() {
return this.allowedMethods;
}
/**
* Set the list of headers that a pre-flight request can list as allowed
* for use during an actual request.
......@@ -195,7 +197,16 @@ public class CorsConfiguration {
* <p>By default this is not set.
*/
public void setAllowedHeaders(List<String> allowedHeaders) {
this.allowedHeaders = (allowedHeaders == null ? null : new ArrayList<String>(allowedHeaders));
this.allowedHeaders = (allowedHeaders != null ? new ArrayList<String>(allowedHeaders) : null);
}
/**
* Return the allowed actual request headers, possibly {@code null}.
* @see #addAllowedHeader(String)
* @see #setAllowedHeaders(List)
*/
public List<String> getAllowedHeaders() {
return this.allowedHeaders;
}
/**
......@@ -208,15 +219,6 @@ public class CorsConfiguration {
this.allowedHeaders.add(allowedHeader);
}
/**
* Return the allowed actual request headers, possibly {@code null}.
* @see #addAllowedHeader(String)
* @see #setAllowedHeaders(List)
*/
public List<String> getAllowedHeaders() {
return this.allowedHeaders;
}
/**
* Set the list of response headers other than simple headers (i.e.
* {@code Cache-Control}, {@code Content-Language}, {@code Content-Type},
......@@ -232,6 +234,15 @@ public class CorsConfiguration {
this.exposedHeaders = (exposedHeaders == null ? null : new ArrayList<String>(exposedHeaders));
}
/**
* Return the configured response headers to expose, possibly {@code null}.
* @see #addExposedHeader(String)
* @see #setExposedHeaders(List)
*/
public List<String> getExposedHeaders() {
return this.exposedHeaders;
}
/**
* Add a response header to expose.
* <p>Note that {@code "*"} is not a valid exposed header value.
......@@ -246,15 +257,6 @@ public class CorsConfiguration {
this.exposedHeaders.add(exposedHeader);
}
/**
* Return the configured response headers to expose, possibly {@code null}.
* @see #addExposedHeader(String)
* @see #setExposedHeaders(List)
*/
public List<String> getExposedHeaders() {
return this.exposedHeaders;
}
/**
* Whether user credentials are supported.
* <p>By default this is not set (i.e. user credentials are not supported).
......@@ -285,9 +287,10 @@ public class CorsConfiguration {
* @see #setMaxAge(Long)
*/
public Long getMaxAge() {
return maxAge;
return this.maxAge;
}
/**
* Check the origin of the request against the configured allowed origins.
* @param requestOrigin the origin to check
......@@ -303,9 +306,10 @@ public class CorsConfiguration {
}
if (this.allowedOrigins.contains(ALL)) {
if ((this.allowCredentials == null) || !this.allowCredentials.booleanValue()) {
if (this.allowCredentials != Boolean.TRUE) {
return ALL;
} else {
}
else {
return requestOrigin;
}
}
......@@ -314,6 +318,7 @@ public class CorsConfiguration {
return requestOrigin;
}
}
return null;
}
......@@ -329,9 +334,10 @@ public class CorsConfiguration {
if (requestMethod == null) {
return null;
}
List<String> allowedMethods = (this.allowedMethods == null ? new ArrayList<String>() : this.allowedMethods);
List<String> allowedMethods =
(this.allowedMethods != null ? this.allowedMethods : new ArrayList<String>());
if (allowedMethods.contains(ALL)) {
return Arrays.asList(requestMethod);
return Collections.singletonList(requestMethod);
}
if (allowedMethods.isEmpty()) {
allowedMethods.add(HttpMethod.GET.name());
......
......@@ -19,8 +19,8 @@ package org.springframework.web.cors;
import javax.servlet.http.HttpServletRequest;
/**
* Interface to be implemented by classes (usually HTTP request handlers) that provides
* a {@link CorsConfiguration} instance based on the provided request.
* Interface to be implemented by classes (usually HTTP request handlers) that
* provides a {@link CorsConfiguration} instance based on the provided request.
*
* @author Sebastien Deleuze
* @since 4.2
......
......@@ -39,11 +39,10 @@ public interface CorsProcessor {
/**
* Process a request given a {@code CorsConfiguration}.
*
* @param configuration the applicable CORS configuration, possibly {@code null}
* @param configuration the applicable CORS configuration (possibly {@code null})
* @param request the current request
* @param response the current response
* @return {@code false} if the request is rejected, else {@code true}.
* @return {@code false} if the request is rejected, {@code true} otherwise
*/
boolean processRequest(CorsConfiguration configuration, HttpServletRequest request,
HttpServletResponse response) throws IOException;
......
......@@ -41,8 +41,8 @@ public class CorsUtils {
* Returns {@code true} if the request is a valid CORS pre-flight one.
*/
public static boolean isPreFlightRequest(HttpServletRequest request) {
return (isCorsRequest(request) && request.getMethod().equals(HttpMethod.OPTIONS.name())
&& request.getHeader(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD) != null);
return (isCorsRequest(request) && request.getMethod().equals(HttpMethod.OPTIONS.name()) &&
request.getHeader(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD) != null);
}
}
......@@ -20,7 +20,6 @@ import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
......@@ -59,8 +58,8 @@ public class DefaultCorsProcessor implements CorsProcessor {
@Override
public boolean processRequest(CorsConfiguration config, HttpServletRequest request,
HttpServletResponse response) throws IOException {
public boolean processRequest(CorsConfiguration config, HttpServletRequest request, HttpServletResponse response)
throws IOException {
if (!CorsUtils.isCorsRequest(request)) {
return true;
......
......@@ -27,19 +27,18 @@ import org.springframework.util.PathMatcher;
import org.springframework.web.util.UrlPathHelper;
/**
* Provide a per request {@link CorsConfiguration} instance based on a collection of
* {@link CorsConfiguration} mapped on path patterns.
* Provide a per request {@link CorsConfiguration} instance based on a
* collection of {@link CorsConfiguration} mapped on path patterns.
*
* <p>Exact path mapping URIs (such as {@code "/admin"}) are supported as
* well as Ant-style path patterns (such as {@code "/admin/**"}).
* <p>Exact path mapping URIs (such as {@code "/admin"}) are supported
* as well as Ant-style path patterns (such as {@code "/admin/**"}).
*
* @author Sebastien Deleuze
* @since 4.2
*/
public class UrlBasedCorsConfigurationSource implements CorsConfigurationSource {
private final Map<String, CorsConfiguration> corsConfigurations =
new LinkedHashMap<String, CorsConfiguration>();
private final Map<String, CorsConfiguration> corsConfigurations = new LinkedHashMap<String, CorsConfiguration>();
private PathMatcher pathMatcher = new AntPathMatcher();
......@@ -120,6 +119,7 @@ public class UrlBasedCorsConfigurationSource implements CorsConfigurationSource
this.corsConfigurations.put(path, config);
}
@Override
public CorsConfiguration getCorsConfiguration(HttpServletRequest request) {
String lookupPath = this.urlPathHelper.getLookupPathForRequest(request);
......
/**
* Support for CORS (Cross-Origin Resource Sharing),
* based on a common {@code CorsProcessor} strategy.
*/
package org.springframework.web.cors;
......@@ -19,7 +19,6 @@ package org.springframework.web.filter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
......@@ -144,8 +143,7 @@ public class ShallowEtagHeaderFilter extends OncePerRequestFilter {
protected boolean isEligibleForEtag(HttpServletRequest request, HttpServletResponse response,
int responseStatusCode, InputStream inputStream) {
if (responseStatusCode >= 200 && responseStatusCode < 300 &&
HttpMethod.GET.name().equals(request.getMethod())) {
if (responseStatusCode >= 200 && responseStatusCode < 300 && HttpMethod.GET.name().equals(request.getMethod())) {
String cacheControl = (responseGetHeaderAvailable ? response.getHeader(HEADER_CACHE_CONTROL) : null);
if (cacheControl == null || !cacheControl.contains(DIRECTIVE_NO_STORE)) {
return true;
......@@ -173,6 +171,7 @@ public class ShallowEtagHeaderFilter extends OncePerRequestFilter {
return builder.toString();
}
/**
* This method can be used to disable the content caching response wrapper
* of the ShallowEtagHeaderFilter. This can be done before the start of HTTP
......@@ -194,10 +193,7 @@ public class ShallowEtagHeaderFilter extends OncePerRequestFilter {
private final HttpServletRequest request;
public HttpStreamingAwareContentCachingResponseWrapper(HttpServletResponse response,
HttpServletRequest request) {
public HttpStreamingAwareContentCachingResponseWrapper(HttpServletResponse response, HttpServletRequest request) {
super(response);
this.request = request;
}
......
......@@ -108,11 +108,11 @@ public abstract class AbstractNamedValueMethodArgumentResolver implements Handle
}
catch (ConversionNotSupportedException ex) {
throw new MethodArgumentConversionNotSupportedException(arg, ex.getRequiredType(),
ex.getCause(), namedValueInfo.name, parameter);
namedValueInfo.name, parameter, ex.getCause());
}
catch (TypeMismatchException ex) {
throw new MethodArgumentTypeMismatchException(arg, ex.getRequiredType(),
ex.getCause(), namedValueInfo.name, parameter);
namedValueInfo.name, parameter, ex.getCause());
}
}
......
......@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.web.method.annotation;
import org.springframework.beans.ConversionNotSupportedException;
......@@ -35,7 +36,7 @@ public class MethodArgumentConversionNotSupportedException extends ConversionNot
public MethodArgumentConversionNotSupportedException(Object value, Class<?> requiredType,
Throwable cause, String name, MethodParameter param) {
String name, MethodParameter param, Throwable cause) {
super(value, requiredType, cause);
this.name = name;
......
......@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.web.method.annotation;
import org.springframework.beans.TypeMismatchException;
......@@ -35,7 +36,7 @@ public class MethodArgumentTypeMismatchException extends TypeMismatchException {
public MethodArgumentTypeMismatchException(Object value, Class<?> requiredType,
Throwable cause, String name, MethodParameter param) {
String name, MethodParameter param, Throwable cause) {
super(value, requiredType, cause);
this.name = name;
......
......@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.web.method.support;
import org.springframework.core.MethodParameter;
......@@ -21,7 +22,7 @@ import org.springframework.core.MethodParameter;
* A {@link HandlerMethodReturnValueHandler} that handles return values that
* represent asynchronous computation. Such handlers need to be invoked with
* precedence over other handlers that might otherwise match the return value
* type -- e.g. a method that returns a Promise type that is also annotated with
* type: e.g. a method that returns a Promise type that is also annotated with
* {@code @ResponseBody}.
*
* <p>In {@link #handleReturnValue}, implementations of this class should create
......@@ -32,7 +33,6 @@ import org.springframework.core.MethodParameter;
* DeferredResult<?> deferredResult = (DeferredResult<?>) returnValue;
* WebAsyncUtils.getAsyncManager(webRequest).startDeferredResultProcessing(deferredResult, mavContainer);
* </pre>
* the return value to a DeferredResult
*
* @author Rossen Stoyanchev
* @since 4.2
......
......@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.web.util;
import java.net.URI;
......@@ -41,12 +42,10 @@ public class DefaultUriTemplateHandler implements UriTemplateHandler {
* have a scheme and host but may also contain a port and a partial path.
* Individual URI templates then may provide the remaining part of the URL
* including additional path, query and fragment.
*
* <p><strong>Note: </strong>Individual URI templates are expanded and
* encoded before being appended to the base URL. Therefore the base URL is
* expected to be fully expanded and encoded, which can be done with the help
* of {@link UriComponentsBuilder}.
*
* @param baseUrl the base URL.
*/
public void setBaseUrl(String baseUrl) {
......
......@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.web.util;
import java.net.URI;
......
......@@ -23,7 +23,6 @@ import org.springframework.util.MultiValueMap;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
/**
* A FlashMap provides a way for one request to store attributes intended for
* use in another. This is most commonly needed when redirecting from one URL
......
......@@ -360,6 +360,7 @@ public abstract class AbstractHandlerMapping extends WebApplicationObjectSupport
String handlerName = (String) handler;
handler = getApplicationContext().getBean(handlerName);
}
HandlerExecutionChain executionChain = getHandlerExecutionChain(handler, request);
if (CorsUtils.isCorsRequest(request)) {
CorsConfiguration globalConfig = this.corsConfigSource.getCorsConfiguration(request);
......@@ -374,17 +375,14 @@ public abstract class AbstractHandlerMapping extends WebApplicationObjectSupport
* Look up a handler for the given request, returning {@code null} if no
* specific one is found. This method is called by {@link #getHandler};
* a {@code null} return value will lead to the default handler, if one is set.
*
* <p>On CORS pre-flight requests this method should return a match not for
* the pre-flight request but for the expected actual request based on the URL
* path, the HTTP methods from the "Access-Control-Request-Method" header, and
* the headers from the "Access-Control-Request-Headers" header thus allowing
* the CORS configuration to be obtained via {@link #getCorsConfigurations},
*
* <p>Note: This method may also return a pre-built {@link HandlerExecutionChain},
* combining a handler object with dynamically determined interceptors.
* Statically specified interceptors will get merged into such an existing chain.
*
* @param request current HTTP request
* @return the corresponding handler instance, or {@code null} if none found
* @throws Exception if there is an internal error
......@@ -489,6 +487,7 @@ public abstract class AbstractHandlerMapping extends WebApplicationObjectSupport
}
}
private class CorsInterceptor extends HandlerInterceptorAdapter {
private final CorsConfiguration config;
......
......@@ -68,7 +68,7 @@ public class ResponseStatusExceptionResolver extends AbstractHandlerExceptionRes
logger.warn("Handling of @ResponseStatus resulted in Exception", resolveEx);
}
}
else if (ex.getCause() != null && ex.getCause() instanceof Exception) {
else if (ex.getCause() instanceof Exception) {
ex = (Exception) ex.getCause();
return doResolveException(request, response, handler, ex);
}
......
......@@ -17,7 +17,6 @@
package org.springframework.web.servlet.resource;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.webjars.MultipleMatchesException;
......@@ -52,10 +51,12 @@ public class WebJarsResourceResolver extends AbstractResourceResolver {
private final WebJarAssetLocator webJarAssetLocator;
public WebJarsResourceResolver() {
this.webJarAssetLocator = new WebJarAssetLocator();
}
@Override
protected Resource resolveResourceInternal(HttpServletRequest request, String requestPath,
List<? extends Resource> locations, ResourceResolverChain chain) {
......@@ -86,7 +87,7 @@ public class WebJarsResourceResolver extends AbstractResourceResolver {
protected String findWebJarResourcePath(String path) {
try {
int startOffset = path.startsWith("/") ? 1 : 0;
int startOffset = (path.startsWith("/") ? 1 : 0);
int endOffset = path.indexOf("/", 1);
if (endOffset != -1) {
String webjar = path.substring(startOffset, endOffset);
......@@ -94,8 +95,11 @@ public class WebJarsResourceResolver extends AbstractResourceResolver {
String webJarPath = webJarAssetLocator.getFullPath(webjar, partialPath);
return webJarPath.substring(WEBJARS_LOCATION_LENGTH);
}
} catch (MultipleMatchesException ex) {
logger.warn("WebJar version conflict for \"" + path + "\"", ex);
}
catch (MultipleMatchesException ex) {
if (logger.isWarnEnabled()) {
logger.warn("WebJar version conflict for \"" + path + "\"", ex);
}
}
catch (IllegalArgumentException ex) {
if (logger.isTraceEnabled()) {
......
......@@ -266,7 +266,8 @@ public class ScriptTemplateView extends AbstractUrlBasedView {
protected ScriptTemplateConfig autodetectViewConfig() throws BeansException {
try {
return BeanFactoryUtils.beanOfTypeIncludingAncestors(getApplicationContext(), ScriptTemplateConfig.class, true, false);
return BeanFactoryUtils.beanOfTypeIncludingAncestors(
getApplicationContext(), ScriptTemplateConfig.class, true, false);
}
catch (NoSuchBeanDefinitionException ex) {
throw new ApplicationContextException("Expected a single ScriptTemplateConfig bean in the current " +
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册