From b4f5c28156cd05b87c30bd72e7aa49bff4684736 Mon Sep 17 00:00:00 2001 From: Kyle Anderson Date: Fri, 9 Dec 2016 11:56:16 -0800 Subject: [PATCH 1/2] #1164 Added Mapping Conflict Check to Spring WebMvc Configuration --- .../AbstractStormpathWebMvcConfiguration.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/extensions/spring/stormpath-spring-webmvc/src/main/java/com/stormpath/spring/config/AbstractStormpathWebMvcConfiguration.java b/extensions/spring/stormpath-spring-webmvc/src/main/java/com/stormpath/spring/config/AbstractStormpathWebMvcConfiguration.java index 3c94b1d635..2f85e94a27 100644 --- a/extensions/spring/stormpath-spring-webmvc/src/main/java/com/stormpath/spring/config/AbstractStormpathWebMvcConfiguration.java +++ b/extensions/spring/stormpath-spring-webmvc/src/main/java/com/stormpath/spring/config/AbstractStormpathWebMvcConfiguration.java @@ -182,12 +182,15 @@ import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; +import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.HandlerMapping; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.i18n.CookieLocaleResolver; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; +import org.springframework.web.servlet.mvc.method.RequestMappingInfo; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; import org.springframework.web.servlet.view.json.MappingJackson2JsonView; @@ -474,6 +477,9 @@ public abstract class AbstractStormpathWebMvcConfiguration { @Autowired //all view resolvers in the spring app context. key: bean name, value: resolver private Map viewResolvers; + @Autowired + private RequestMappingHandlerMapping requestMappingHandlerMapping; + private static class AccessibleResourceHandlerRegistry extends ResourceHandlerRegistry { public AccessibleResourceHandlerRegistry(ApplicationContext applicationContext, ServletContext servletContext) { super(applicationContext, servletContext); @@ -1322,6 +1328,7 @@ private T configure(T c) { private T init(T c) { try { c.init(); + assertUniqueMethodMapping(c); return c; } catch (Exception e) { String msg = "Unable to initialize controller [" + c + "]: " + e.getMessage(); @@ -1563,5 +1570,25 @@ public List stormpathCorsAllowedHeaders() { return java.util.Collections.emptyList(); } + + /** + * Fix for https://github.com/stormpath/stormpath-sdk-java/issues/1164 + * + * @since 1.2.3 + */ + private void assertUniqueMethodMapping(T c) { + Set requestMappingInfoSet = requestMappingHandlerMapping.getHandlerMethods().keySet(); + for(RequestMappingInfo requestMappingInfo : requestMappingInfoSet){ + Set patterns = requestMappingInfo.getPatternsCondition().getPatterns(); + for(String pattern: patterns){ + if(c.getUri() != null && c.getUri().equals(pattern)){ + HandlerMethod handlerMethod = requestMappingHandlerMapping.getHandlerMethods().get(requestMappingInfo); + throw new IllegalStateException("Mapping conflict. Stormpath cannot map '" + c.getUri() + "'. " + + "There is already '" + handlerMethod.getBean() + + "' bean method\n" + handlerMethod + " mapped."); + } + } + } + } } From c16047fa7f57047bd807b003f9bf3e5ad1f47028 Mon Sep 17 00:00:00 2001 From: Kyle Anderson Date: Wed, 4 Jan 2017 08:32:13 -0800 Subject: [PATCH 2/2] #1164 Formatting Improvements --- .../AbstractStormpathWebMvcConfiguration.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/extensions/spring/stormpath-spring-webmvc/src/main/java/com/stormpath/spring/config/AbstractStormpathWebMvcConfiguration.java b/extensions/spring/stormpath-spring-webmvc/src/main/java/com/stormpath/spring/config/AbstractStormpathWebMvcConfiguration.java index 2f85e94a27..5d123bbf22 100644 --- a/extensions/spring/stormpath-spring-webmvc/src/main/java/com/stormpath/spring/config/AbstractStormpathWebMvcConfiguration.java +++ b/extensions/spring/stormpath-spring-webmvc/src/main/java/com/stormpath/spring/config/AbstractStormpathWebMvcConfiguration.java @@ -1574,18 +1574,17 @@ public List stormpathCorsAllowedHeaders() { /** * Fix for https://github.com/stormpath/stormpath-sdk-java/issues/1164 * - * @since 1.2.3 + * @since 1.3.0 */ private void assertUniqueMethodMapping(T c) { Set requestMappingInfoSet = requestMappingHandlerMapping.getHandlerMethods().keySet(); - for(RequestMappingInfo requestMappingInfo : requestMappingInfoSet){ + for (RequestMappingInfo requestMappingInfo : requestMappingInfoSet) { Set patterns = requestMappingInfo.getPatternsCondition().getPatterns(); - for(String pattern: patterns){ - if(c.getUri() != null && c.getUri().equals(pattern)){ + for (String pattern: patterns) { + if (c.getUri() != null && c.getUri().equals(pattern)) { HandlerMethod handlerMethod = requestMappingHandlerMapping.getHandlerMethods().get(requestMappingInfo); - throw new IllegalStateException("Mapping conflict. Stormpath cannot map '" + c.getUri() + "'. " + - "There is already '" + handlerMethod.getBean() + - "' bean method\n" + handlerMethod + " mapped."); + throw new IllegalStateException("Mapping conflict: Stormpath cannot map '" + c.getUri() + "'. " + + handlerMethod.getBean() + "#" + handlerMethod + " is already mapped to this URI."); } } }