diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/config/ResourceHandlerRegistry.java b/spring-webflux/src/main/java/org/springframework/web/reactive/config/ResourceHandlerRegistry.java index cd9dc05a239..bcdff7fa8af 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/config/ResourceHandlerRegistry.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/config/ResourceHandlerRegistry.java @@ -152,10 +152,7 @@ public class ResourceHandlerRegistry { urlMap.put(pathPattern, handler); } } - SimpleUrlHandlerMapping handlerMapping = new SimpleUrlHandlerMapping(); - handlerMapping.setOrder(this.order); - handlerMapping.setUrlMap(urlMap); - return handlerMapping; + return new SimpleUrlHandlerMapping(urlMap, this.order); } } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/handler/SimpleUrlHandlerMapping.java b/spring-webflux/src/main/java/org/springframework/web/reactive/handler/SimpleUrlHandlerMapping.java index 131c4f99e2f..3e6e5c0f59d 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/handler/SimpleUrlHandlerMapping.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/handler/SimpleUrlHandlerMapping.java @@ -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. @@ -32,12 +32,11 @@ import org.springframework.util.CollectionUtils; *

The "urlMap" property is suitable for populating the handler map with * bean instances. Mappings to bean names can be set via the "mappings" * property, in a form accepted by the {@code java.util.Properties} class, - * like as follows: + * as follows: * - *

+ * 
  * /welcome.html=ticketController
- * /show.html=ticketController
- * 
+ * /show.html=ticketController
* *

The syntax is {@code PATH=HANDLER_BEAN_NAME}. If the path doesn't begin * with a slash, one is prepended. @@ -49,6 +48,7 @@ import org.springframework.util.CollectionUtils; * {@link org.springframework.web.util.pattern.PathPattern} javadoc. * * @author Rossen Stoyanchev + * @author Sam Brannen * @since 5.0 */ public class SimpleUrlHandlerMapping extends AbstractUrlHandlerMapping { @@ -56,6 +56,39 @@ public class SimpleUrlHandlerMapping extends AbstractUrlHandlerMapping { private final Map urlMap = new LinkedHashMap<>(); + /** + * Create a {@code SimpleUrlHandlerMapping} with default settings. + * @since 5.2 + */ + public SimpleUrlHandlerMapping() { + } + + /** + * Create a {@code SimpleUrlHandlerMapping} using the supplied URL map. + * @param urlMap map with URL paths as keys and handler beans (or handler + * bean names) as values + * @since 5.2 + * @see #setUrlMap(Map) + */ + public SimpleUrlHandlerMapping(Map urlMap) { + setUrlMap(urlMap); + } + + /** + * Create a {@code SimpleUrlHandlerMapping} using the supplied URL map and order. + * @param urlMap map with URL paths as keys and handler beans (or handler + * bean names) as values + * @param order the order value for this {@code SimpleUrlHandlerMapping} + * @since 5.2 + * @see #setUrlMap(Map) + * @see #setOrder(int) + */ + public SimpleUrlHandlerMapping(Map urlMap, int order) { + setUrlMap(urlMap); + setOrder(order); + } + + /** * Map URL paths to handler bean names. * This is the typical way of configuring this HandlerMapping. diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/resource/ResourceUrlProviderTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/resource/ResourceUrlProviderTests.java index 0ac197beb8d..b6caad2d2bc 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/resource/ResourceUrlProviderTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/resource/ResourceUrlProviderTests.java @@ -152,12 +152,7 @@ public class ResourceUrlProviderTests { @Bean public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { - ResourceWebHandler handler = new ResourceWebHandler(); - HashMap handlerMap = new HashMap<>(); - handlerMap.put("/resources/**", handler); - SimpleUrlHandlerMapping hm = new SimpleUrlHandlerMapping(); - hm.setUrlMap(handlerMap); - return hm; + return new SimpleUrlHandlerMapping(Collections.singletonMap("/resources/**", new ResourceWebHandler())); } @Bean diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/SimpleUrlHandlerMappingIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/SimpleUrlHandlerMappingIntegrationTests.java index 422e8725e2f..539dde8da7e 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/SimpleUrlHandlerMappingIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/SimpleUrlHandlerMappingIntegrationTests.java @@ -119,20 +119,16 @@ public class SimpleUrlHandlerMappingIntegrationTests extends AbstractHttpHandler @Bean public SimpleUrlHandlerMapping handlerMapping() { - return new SimpleUrlHandlerMapping() { - { - Map map = new HashMap<>(); - map.put("/foo", (WebHandler) exchange -> - exchange.getResponse().writeWith(Flux.just(asDataBuffer("foo")))); - map.put("/bar", (WebHandler) exchange -> - exchange.getResponse().writeWith(Flux.just(asDataBuffer("bar")))); - map.put("/header", (WebHandler) exchange -> { - exchange.getResponse().getHeaders().add("foo", "bar"); - return Mono.empty(); - }); - setUrlMap(map); - } - }; + Map map = new HashMap<>(); + map.put("/foo", (WebHandler) exchange -> + exchange.getResponse().writeWith(Flux.just(asDataBuffer("foo")))); + map.put("/bar", (WebHandler) exchange -> + exchange.getResponse().writeWith(Flux.just(asDataBuffer("bar")))); + map.put("/header", (WebHandler) exchange -> { + exchange.getResponse().getHeaders().add("foo", "bar"); + return Mono.empty(); + }); + return new SimpleUrlHandlerMapping(map); } @Bean diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/socket/WebSocketIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/socket/WebSocketIntegrationTests.java index f40381d2400..a77567542ff 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/socket/WebSocketIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/socket/WebSocketIntegrationTests.java @@ -145,12 +145,8 @@ public class WebSocketIntegrationTests extends AbstractWebSocketIntegrationTests map.put("/sub-protocol", new SubProtocolWebSocketHandler()); map.put("/custom-header", new CustomHeaderHandler()); map.put("/close", new SessionClosingHandler()); - - SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping(); - mapping.setUrlMap(map); - return mapping; + return new SimpleUrlHandlerMapping(map); } - } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/DefaultServletHandlerConfigurer.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/DefaultServletHandlerConfigurer.java index f73064220f5..993e952d011 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/DefaultServletHandlerConfigurer.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/DefaultServletHandlerConfigurer.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 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. @@ -19,6 +19,7 @@ package org.springframework.web.servlet.config.annotation; import java.util.Collections; import javax.servlet.ServletContext; +import org.springframework.core.Ordered; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.servlet.DispatcherServlet; @@ -85,9 +86,10 @@ public class DefaultServletHandlerConfigurer { /** - * Return a handler mapping instance ordered at {@link Integer#MAX_VALUE} containing the - * {@link DefaultServletHttpRequestHandler} instance mapped to {@code "/**"}; - * or {@code null} if default servlet handling was not been enabled. + * Return a handler mapping instance ordered at {@link Ordered#LOWEST_PRECEDENCE} + * containing the {@link DefaultServletHttpRequestHandler} instance mapped + * to {@code "/**"}; or {@code null} if default servlet handling was not + * been enabled. * @since 4.3.12 */ @Nullable @@ -95,11 +97,8 @@ public class DefaultServletHandlerConfigurer { if (this.handler == null) { return null; } - - SimpleUrlHandlerMapping handlerMapping = new SimpleUrlHandlerMapping(); - handlerMapping.setUrlMap(Collections.singletonMap("/**", this.handler)); - handlerMapping.setOrder(Integer.MAX_VALUE); - return handlerMapping; + return new SimpleUrlHandlerMapping(Collections.singletonMap("/**", this.handler), + Ordered.LOWEST_PRECEDENCE); } } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ResourceHandlerRegistry.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ResourceHandlerRegistry.java index 3c33770df3b..2c71f9aba6f 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ResourceHandlerRegistry.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ResourceHandlerRegistry.java @@ -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. @@ -177,10 +177,7 @@ public class ResourceHandlerRegistry { } } - SimpleUrlHandlerMapping handlerMapping = new SimpleUrlHandlerMapping(); - handlerMapping.setOrder(this.order); - handlerMapping.setUrlMap(urlMap); - return handlerMapping; + return new SimpleUrlHandlerMapping(urlMap, this.order); } } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ViewControllerRegistry.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ViewControllerRegistry.java index 673682b15db..cf940cca2af 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ViewControllerRegistry.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ViewControllerRegistry.java @@ -125,10 +125,7 @@ public class ViewControllerRegistry { urlMap.put(registration.getUrlPath(), registration.getViewController()); } - SimpleUrlHandlerMapping handlerMapping = new SimpleUrlHandlerMapping(); - handlerMapping.setUrlMap(urlMap); - handlerMapping.setOrder(this.order); - return handlerMapping; + return new SimpleUrlHandlerMapping(urlMap, this.order); } } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/SimpleUrlHandlerMapping.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/SimpleUrlHandlerMapping.java index fc169ae2924..a16c07b4217 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/SimpleUrlHandlerMapping.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/SimpleUrlHandlerMapping.java @@ -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. @@ -34,13 +34,14 @@ import org.springframework.util.CollectionUtils; * bean references, e.g. via the map element in XML bean definitions. * *

Mappings to bean names can be set via the "mappings" property, in a form - * accepted by the {@code java.util.Properties} class, like as follows:
- * {@code + * accepted by the {@code java.util.Properties} class, as follows: + * + *

  * /welcome.html=ticketController
- * /show.html=ticketController
- * }
- * The syntax is {@code PATH=HANDLER_BEAN_NAME}. - * If the path doesn't begin with a slash, one is prepended. + * /show.html=ticketController
+ * + *

The syntax is {@code PATH=HANDLER_BEAN_NAME}. If the path doesn't begin + * with a slash, one is prepended. * *

Supports direct matches (given "/test" -> registered "/test") and "*" * pattern matches (given "/test" -> registered "/t*"). Note that the default @@ -50,6 +51,7 @@ import org.springframework.util.CollectionUtils; * @author Rod Johnson * @author Juergen Hoeller + * @author Sam Brannen * @see #setMappings * @see #setUrlMap * @see BeanNameUrlHandlerMapping @@ -59,6 +61,39 @@ public class SimpleUrlHandlerMapping extends AbstractUrlHandlerMapping { private final Map urlMap = new LinkedHashMap<>(); + /** + * Create a {@code SimpleUrlHandlerMapping} with default settings. + * @since 5.2 + */ + public SimpleUrlHandlerMapping() { + } + + /** + * Create a {@code SimpleUrlHandlerMapping} using the supplied URL map. + * @param urlMap map with URL paths as keys and handler beans (or handler + * bean names) as values + * @since 5.2 + * @see #setUrlMap(Map) + */ + public SimpleUrlHandlerMapping(Map urlMap) { + setUrlMap(urlMap); + } + + /** + * Create a {@code SimpleUrlHandlerMapping} using the supplied URL map and order. + * @param urlMap map with URL paths as keys and handler beans (or handler + * bean names) as values + * @param order the order value for this {@code SimpleUrlHandlerMapping} + * @since 5.2 + * @see #setUrlMap(Map) + * @see #setOrder(int) + */ + public SimpleUrlHandlerMapping(Map urlMap, int order) { + setUrlMap(urlMap); + setOrder(order); + } + + /** * Map URL paths to handler bean names. * This is the typical way of configuring this HandlerMapping. diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/handler/SimpleUrlHandlerMappingTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/handler/SimpleUrlHandlerMappingTests.java index a5c25777640..73976804d3e 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/handler/SimpleUrlHandlerMappingTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/handler/SimpleUrlHandlerMappingTests.java @@ -16,8 +16,7 @@ package org.springframework.web.servlet.handler; -import java.util.LinkedHashMap; -import java.util.Map; +import java.util.Collections; import org.junit.Test; @@ -72,12 +71,10 @@ public class SimpleUrlHandlerMappingTests { @Test public void testNewlineInRequest() throws Exception { - SimpleUrlHandlerMapping handlerMapping = new SimpleUrlHandlerMapping(); - handlerMapping.setUrlDecode(false); Object controller = new Object(); - Map urlMap = new LinkedHashMap<>(); - urlMap.put("/*/baz", controller); - handlerMapping.setUrlMap(urlMap); + SimpleUrlHandlerMapping handlerMapping = new SimpleUrlHandlerMapping( + Collections.singletonMap("/*/baz", controller)); + handlerMapping.setUrlDecode(false); handlerMapping.setApplicationContext(new StaticApplicationContext()); MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo%0a%0dbar/baz"); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceUrlProviderTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceUrlProviderTests.java index ef240d17de2..9ada1eca34a 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceUrlProviderTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceUrlProviderTests.java @@ -17,6 +17,7 @@ package org.springframework.web.servlet.resource; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -174,12 +175,8 @@ public class ResourceUrlProviderTests { @Bean public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { - ResourceHttpRequestHandler handler = new ResourceHttpRequestHandler(); - HashMap handlerMap = new HashMap<>(); - handlerMap.put("/resources/**", handler); - SimpleUrlHandlerMapping hm = new SimpleUrlHandlerMapping(); - hm.setUrlMap(handlerMap); - return hm; + return new SimpleUrlHandlerMapping( + Collections.singletonMap("/resources/**", new ResourceHttpRequestHandler())); } @Bean diff --git a/src/docs/asciidoc/web/webflux-websocket.adoc b/src/docs/asciidoc/web/webflux-websocket.adoc index 8dbeb01d1be..4585333b31a 100644 --- a/src/docs/asciidoc/web/webflux-websocket.adoc +++ b/src/docs/asciidoc/web/webflux-websocket.adoc @@ -53,11 +53,9 @@ Then you can map it to a URL and add a `WebSocketHandlerAdapter`, as the followi public HandlerMapping handlerMapping() { Map map = new HashMap<>(); map.put("/path", new MyWebSocketHandler()); + int order = -1; // before annotated controllers - SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping(); - mapping.setUrlMap(map); - mapping.setOrder(-1); // before annotated controllers - return mapping; + return new SimpleUrlHandlerMapping(map, order); } @Bean