diff --git a/spring-data-rest-tests/spring-data-rest-tests-jpa/src/test/java/org/springframework/data/rest/webmvc/jpa/CorsIntegrationTests.java b/spring-data-rest-tests/spring-data-rest-tests-jpa/src/test/java/org/springframework/data/rest/webmvc/jpa/CorsIntegrationTests.java index 058c351da..b93de4c9d 100755 --- a/spring-data-rest-tests/spring-data-rest-tests-jpa/src/test/java/org/springframework/data/rest/webmvc/jpa/CorsIntegrationTests.java +++ b/spring-data-rest-tests/spring-data-rest-tests-jpa/src/test/java/org/springframework/data/rest/webmvc/jpa/CorsIntegrationTests.java @@ -69,8 +69,7 @@ public class CorsIntegrationTests extends AbstractWebIntegrationTests { mvc.perform(options(findItems.expand().getHref()).header(HttpHeaders.ORIGIN, "http://far.far.example") .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "POST")) // .andExpect(status().isOk()) // - .andExpect( - header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS,TRACE")); + .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET,HEAD,POST")); } @Test // DATAREST-573 @@ -140,7 +139,6 @@ public class CorsIntegrationTests extends AbstractWebIntegrationTests { mvc.perform(options(authorsLink.expand().getHref()).header(HttpHeaders.ORIGIN, "http://not.so.far.example") .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "POST")) // .andExpect(status().isOk()) // - .andExpect(header().longValue(HttpHeaders.ACCESS_CONTROL_MAX_AGE, 1234)) // .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "http://not.so.far.example")) // .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true")) // .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET,PATCH,POST")); diff --git a/spring-data-rest-tests/spring-data-rest-tests-jpa/src/test/java/org/springframework/data/rest/webmvc/jpa/LocalConfigCorsIntegrationTests.java b/spring-data-rest-tests/spring-data-rest-tests-jpa/src/test/java/org/springframework/data/rest/webmvc/jpa/LocalConfigCorsIntegrationTests.java index 827f49fc6..b3eb6b9a3 100755 --- a/spring-data-rest-tests/spring-data-rest-tests-jpa/src/test/java/org/springframework/data/rest/webmvc/jpa/LocalConfigCorsIntegrationTests.java +++ b/spring-data-rest-tests/spring-data-rest-tests-jpa/src/test/java/org/springframework/data/rest/webmvc/jpa/LocalConfigCorsIntegrationTests.java @@ -56,7 +56,6 @@ public class LocalConfigCorsIntegrationTests extends AbstractWebIntegrationTests mvc.perform(options(findItems.expand().getHref()).header(HttpHeaders.ORIGIN, "http://far.far.example") .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "POST")) // .andExpect(status().isOk()) // - .andExpect( - header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS,TRACE")); + .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET,HEAD,POST")); } } diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMapping.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMapping.java index 52eeabd69..c54d36cd0 100644 --- a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMapping.java +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMapping.java @@ -18,7 +18,6 @@ package org.springframework.data.rest.webmvc; import lombok.NonNull; import lombok.RequiredArgsConstructor; -import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashSet; @@ -37,11 +36,9 @@ import org.springframework.data.rest.core.mapping.ResourceMappings; import org.springframework.data.rest.core.mapping.ResourceMetadata; import org.springframework.data.rest.webmvc.support.JpaHelper; import org.springframework.data.util.ProxyUtils; -import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor; import org.springframework.util.Assert; -import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.util.StringValueResolver; import org.springframework.web.bind.annotation.CrossOrigin; @@ -346,28 +343,7 @@ public class RepositoryRestHandlerMapping extends BasePathAwareHandlerMapping { CorsConfiguration config = new CorsConfiguration(); updateCorsConfig(config, typeAnnotation); - - if (CollectionUtils.isEmpty(config.getAllowedOrigins())) { - config.setAllowedOrigins(Arrays.asList(CrossOrigin.DEFAULT_ORIGINS)); - } - - if (CollectionUtils.isEmpty(config.getAllowedMethods())) { - for (HttpMethod httpMethod : HttpMethod.values()) { - config.addAllowedMethod(httpMethod); - } - } - - if (CollectionUtils.isEmpty(config.getAllowedHeaders())) { - config.setAllowedHeaders(Arrays.asList(CrossOrigin.DEFAULT_ALLOWED_HEADERS)); - } - - if (config.getAllowCredentials() == null) { - config.setAllowCredentials(CrossOrigin.DEFAULT_ALLOW_CREDENTIALS); - } - - if (config.getMaxAge() == null) { - config.setMaxAge(CrossOrigin.DEFAULT_MAX_AGE); - } + config.applyPermitDefaultValues(); return config; } diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/support/DelegatingHandlerMapping.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/support/DelegatingHandlerMapping.java index 6e20bce40..2156297d1 100644 --- a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/support/DelegatingHandlerMapping.java +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/support/DelegatingHandlerMapping.java @@ -33,6 +33,7 @@ import org.springframework.web.servlet.HandlerExecutionChain; import org.springframework.web.servlet.HandlerMapping; import org.springframework.web.servlet.handler.MatchableHandlerMapping; import org.springframework.web.servlet.handler.RequestMatchResult; +import org.springframework.web.util.pattern.PathPatternParser; /** * A {@link HandlerMapping} that considers a {@link List} of delegates. It will keep on traversing the delegates in case @@ -89,6 +90,14 @@ public class DelegatingHandlerMapping implements HandlerMapping, Ordered, Matcha } } + /* + * (non-Javadoc) + * @see org.springframework.web.servlet.handler.MatchableHandlerMapping#getPatternParser() + */ + public PathPatternParser getPatternParser() { + return null; + } + @Value private static class HandlerSelectionResult { diff --git a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/RepositoryCorsConfigurationAccessorUnitTests.java b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/RepositoryCorsConfigurationAccessorUnitTests.java index d4574b1a2..6aa6fa3a8 100755 --- a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/RepositoryCorsConfigurationAccessorUnitTests.java +++ b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/RepositoryCorsConfigurationAccessorUnitTests.java @@ -25,7 +25,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; - import org.springframework.data.repository.support.Repositories; import org.springframework.data.rest.core.mapping.ResourceMappings; import org.springframework.data.rest.webmvc.RepositoryRestHandlerMapping.NoOpStringValueResolver; @@ -62,11 +61,10 @@ public class RepositoryCorsConfigurationAccessorUnitTests { CorsConfiguration configuration = accessor.createConfiguration(AnnotatedRepository.class); assertThat(configuration).isNotNull(); - assertThat(configuration.getAllowCredentials()).isFalse(); + assertThat(configuration.getAllowCredentials()).isNull(); assertThat(configuration.getAllowedHeaders()).contains("*"); assertThat(configuration.getAllowedOrigins()).contains("*"); - assertThat(configuration.getAllowedMethods()).contains("OPTIONS", "HEAD", "GET", "PATCH", "POST", "PUT", "DELETE", - "TRACE"); + assertThat(configuration.getAllowedMethods()).contains("HEAD", "GET", "POST"); assertThat(configuration.getMaxAge()).isEqualTo(1800L); } diff --git a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMappingUnitTests.java b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMappingUnitTests.java index 27cac021f..207fc3066 100755 --- a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMappingUnitTests.java +++ b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMappingUnitTests.java @@ -21,6 +21,8 @@ import static org.mockito.Mockito.*; import java.lang.reflect.Method; import java.util.Collections; +import javax.servlet.http.HttpServletRequest; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -69,7 +71,7 @@ public class RepositoryRestHandlerMappingUnitTests { @Mock Repositories repositories; RepositoryRestConfiguration configuration; - RepositoryRestHandlerMapping handlerMapping; + HandlerMappingStub handlerMapping; MockHttpServletRequest mockRequest; Method listEntitiesMethod, rootHandlerMethod; @@ -79,7 +81,7 @@ public class RepositoryRestHandlerMappingUnitTests { configuration = new RepositoryRestConfiguration(new ProjectionDefinitionConfiguration(), new MetadataConfiguration(), mock(EnumTranslationConfiguration.class)); - handlerMapping = new RepositoryRestHandlerMapping(mappings, configuration, repositories); + handlerMapping = new HandlerMappingStub(mappings, configuration, repositories); handlerMapping.setApplicationContext(CONTEXT); mockRequest = new MockHttpServletRequest(); @@ -103,7 +105,7 @@ public class RepositoryRestHandlerMappingUnitTests { public void returnsNullForUriNotMapped() throws Exception { handlerMapping.afterPropertiesSet(); - assertThat(handlerMapping.lookupHandlerMethod("/foo", mockRequest)).isNull(); + assertThat(handlerMapping.getHandler(mockRequest)).isNull(); } @Test // DATAREST-111 @@ -113,7 +115,7 @@ public class RepositoryRestHandlerMappingUnitTests { mockRequest = new MockHttpServletRequest("GET", "/people"); handlerMapping.afterPropertiesSet(); - HandlerMethod method = handlerMapping.lookupHandlerMethod("/people", mockRequest); + HandlerMethod method = handlerMapping.getHandlerInternal(mockRequest); assertThat(method).isNotNull(); assertThat(method.getMethod()).isEqualTo(listEntitiesMethod); @@ -128,7 +130,7 @@ public class RepositoryRestHandlerMappingUnitTests { configuration.setBasePath("/base"); handlerMapping.afterPropertiesSet(); - HandlerMethod method = handlerMapping.lookupHandlerMethod("/base/people", mockRequest); + HandlerMethod method = handlerMapping.getHandlerInternal(mockRequest); assertThat(method).isNotNull(); assertThat(method.getMethod()).isEqualTo(listEntitiesMethod); @@ -142,7 +144,7 @@ public class RepositoryRestHandlerMappingUnitTests { configuration.setBasePath("/base"); handlerMapping.afterPropertiesSet(); - HandlerMethod method = handlerMapping.lookupHandlerMethod("/base", mockRequest); + HandlerMethod method = handlerMapping.getHandlerInternal(mockRequest); assertThat(method).isNotNull(); assertThat(method.getMethod()).isEqualTo(rootHandlerMethod); @@ -157,7 +159,7 @@ public class RepositoryRestHandlerMappingUnitTests { configuration.setBasePath("/base"); handlerMapping.afterPropertiesSet(); - HandlerMethod method = handlerMapping.lookupHandlerMethod("/base/people/", mockRequest); + HandlerMethod method = handlerMapping.getHandlerInternal(mockRequest); assertThat(method).isNotNull(); assertThat(method.getMethod()).isEqualTo(listEntitiesMethod); @@ -173,7 +175,7 @@ public class RepositoryRestHandlerMappingUnitTests { configuration.setBasePath("/base"); handlerMapping.afterPropertiesSet(); - HandlerMethod method = handlerMapping.lookupHandlerMethod("/base/people", mockRequest); + HandlerMethod method = handlerMapping.getHandlerInternal(mockRequest); assertThat(method).isNotNull(); assertThat(method.getMethod()).isEqualTo(listEntitiesMethod); @@ -187,7 +189,7 @@ public class RepositoryRestHandlerMappingUnitTests { configuration.setBasePath("/base"); - HandlerMethod method = handlerMapping.lookupHandlerMethod("/servlet-path", mockRequest); + HandlerMethod method = handlerMapping.getHandlerInternal(mockRequest); assertThat(method).isNull(); } @@ -204,7 +206,7 @@ public class RepositoryRestHandlerMappingUnitTests { configuration.setBasePath(baseUri); - HandlerMethod method = handlerMapping.lookupHandlerMethod("/people", mockRequest); + HandlerMethod method = handlerMapping.getHandlerInternal(mockRequest); assertThat(method).isNull(); } @@ -280,7 +282,7 @@ public class RepositoryRestHandlerMappingUnitTests { MockHttpServletRequest mockRequest = new MockHttpServletRequest("GET", "/people/search/findByLastnameLike"); handlerMapping.afterPropertiesSet(); - handlerMapping.lookupHandlerMethod("/people/search/findByLastnameLike", mockRequest); + handlerMapping.getHandlerInternal(mockRequest); assertThat(mockRequest.getAttribute(RepositoryRestHandlerMapping.EFFECTIVE_LOOKUP_PATH_ATTRIBUTE)) // .isInstanceOfSatisfying(PathPattern.class, it -> { @@ -299,8 +301,7 @@ public class RepositoryRestHandlerMappingUnitTests { handlerMapping.afterPropertiesSet(); - assertThatCode(() -> handlerMapping.lookupHandlerMethod("/people/search", request)) // - .doesNotThrowAnyException(); + assertThatCode(() -> handlerMapping.getHandlerInternal(request)).doesNotThrowAnyException(); } private static Class createProxy(Object source) { @@ -322,9 +323,23 @@ public class RepositoryRestHandlerMappingUnitTests { super(mappings, configuration); } + public HandlerMappingStub(ResourceMappings mappings, RepositoryRestConfiguration configuration, + Repositories repositories) { + super(mappings, configuration, repositories); + } + @Override public boolean isHandler(Class beanType) { return super.isHandler(beanType); } + + /* + * (non-Javadoc) + * @see org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping#getHandlerInternal(javax.servlet.http.HttpServletRequest) + */ + @Override + public HandlerMethod getHandlerInternal(HttpServletRequest request) throws Exception { + return super.getHandlerInternal(request); + } } } diff --git a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/support/DelegatingHandlerMappingUnitTests.java b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/support/DelegatingHandlerMappingUnitTests.java index ae2982754..10850edf9 100755 --- a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/support/DelegatingHandlerMappingUnitTests.java +++ b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/support/DelegatingHandlerMappingUnitTests.java @@ -66,12 +66,12 @@ public class DelegatingHandlerMappingUnitTests { // Given: // A matching mapping that doesn't get selected MatchableHandlerMapping third = mock(MatchableHandlerMapping.class); - doReturn(mock(RequestMatchResult.class)).when(third).match(any(), any()); + doReturn(mock(RequestMatchResult.class)).when(third).match(any(), any(String.class)); // A matching mapping that gets selected RequestMatchResult result = mock(RequestMatchResult.class); MatchableHandlerMapping fourth = mock(MatchableHandlerMapping.class, Answers.RETURNS_MOCKS); - doReturn(result).when(fourth).match(any(), any()); + doReturn(result).when(fourth).match(any(), any(String.class)); DelegatingHandlerMapping mapping = new DelegatingHandlerMapping(Arrays.asList(first, second, third, fourth));