Browse Source
This change adds a strategy for assigning a default name to an @RequestMapping controller method. The @RequestMapping annotation itself now has a name attribute allowing the explicit assignment of a mapping name. This is mainly intended for use in EL expressions in views. The RequestContext class now provides a getMvcUrl method that internally delegates to MvcUriComponents to look up the handler method. See the Javadoc of MvcUriComponents.fromMappingName. Issue: SPR-5779pull/537/merge
14 changed files with 499 additions and 51 deletions
@ -0,0 +1,64 @@
@@ -0,0 +1,64 @@
|
||||
/* |
||||
* Copyright 2002-2014 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.web.method.support; |
||||
|
||||
import org.junit.Test; |
||||
import org.springframework.core.MethodParameter; |
||||
import org.springframework.util.ClassUtils; |
||||
import org.springframework.web.bind.annotation.RequestHeader; |
||||
import org.springframework.web.bind.annotation.RequestParam; |
||||
import org.springframework.web.method.annotation.RequestHeaderMethodArgumentResolver; |
||||
import org.springframework.web.method.annotation.RequestParamMethodArgumentResolver; |
||||
|
||||
import java.lang.reflect.Method; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
import static org.junit.Assert.assertFalse; |
||||
import static org.junit.Assert.assertTrue; |
||||
|
||||
/** |
||||
* Unit tests for |
||||
* {@link org.springframework.web.method.support.CompositeUriComponentsContributor}. |
||||
* |
||||
* @author Rossen Stoyanchev |
||||
*/ |
||||
public class CompositeUriComponentsContributorTests { |
||||
|
||||
|
||||
@Test |
||||
public void supportsParameter() { |
||||
|
||||
List<HandlerMethodArgumentResolver> resolvers = new ArrayList<HandlerMethodArgumentResolver>(); |
||||
resolvers.add(new RequestParamMethodArgumentResolver(false)); |
||||
resolvers.add(new RequestHeaderMethodArgumentResolver(null)); |
||||
resolvers.add(new RequestParamMethodArgumentResolver(true)); |
||||
|
||||
Method method = ClassUtils.getMethod(this.getClass(), "handleRequest", String.class, String.class, String.class); |
||||
|
||||
CompositeUriComponentsContributor contributor = new CompositeUriComponentsContributor(resolvers); |
||||
assertTrue(contributor.supportsParameter(new MethodParameter(method, 0))); |
||||
assertTrue(contributor.supportsParameter(new MethodParameter(method, 1))); |
||||
assertFalse(contributor.supportsParameter(new MethodParameter(method, 2))); |
||||
} |
||||
|
||||
|
||||
@SuppressWarnings("unused") |
||||
public void handleRequest(@RequestParam String p1, String p2, @RequestHeader String h) { |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,41 @@
@@ -0,0 +1,41 @@
|
||||
/* |
||||
* Copyright 2002-2014 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.web.servlet.handler; |
||||
|
||||
import org.springframework.web.method.HandlerMethod; |
||||
|
||||
import java.lang.reflect.Method; |
||||
|
||||
/** |
||||
* A strategy for assigning a name to a controller method mapping. |
||||
* |
||||
* @author Rossen Stoyanchev |
||||
* @since 4.1 |
||||
*/ |
||||
public interface HandlerMethodMappingNamingStrategy<T> { |
||||
|
||||
/** |
||||
* Determine the name for the given HandlerMethod and mapping. |
||||
* |
||||
* @param handlerMethod the handler method |
||||
* @param mapping the mapping |
||||
* |
||||
* @return the name |
||||
*/ |
||||
String getName(HandlerMethod handlerMethod, T mapping); |
||||
|
||||
} |
||||
@ -0,0 +1,60 @@
@@ -0,0 +1,60 @@
|
||||
/* |
||||
* Copyright 2002-2014 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.web.servlet.mvc.method; |
||||
|
||||
import org.springframework.web.method.HandlerMethod; |
||||
import org.springframework.web.servlet.handler.HandlerMethodMappingNamingStrategy; |
||||
|
||||
import java.lang.reflect.Method; |
||||
|
||||
/** |
||||
* A {@link org.springframework.web.servlet.handler.HandlerMethodMappingNamingStrategy |
||||
* HandlerMethodMappingNamingStrategy} for {@code RequestMappingInfo}-based handler |
||||
* method mappings. |
||||
* |
||||
* If the {@code RequestMappingInfo} name attribute is set, its value is used. |
||||
* Otherwise the name is based on the capital letters of the class name, |
||||
* followed by "#" as a separator, and the method name. For example "TC#getFoo" |
||||
* for a class named TestController with method getFoo. |
||||
* |
||||
* @author Rossen Stoyanchev |
||||
* @since 4.1 |
||||
*/ |
||||
public class RequestMappingInfoHandlerMethodMappingNamingStrategy |
||||
implements HandlerMethodMappingNamingStrategy<RequestMappingInfo> { |
||||
|
||||
/** Separator between the type and method-level parts of a HandlerMethod mapping name */ |
||||
public static final String SEPARATOR = "#"; |
||||
|
||||
|
||||
@Override |
||||
public String getName(HandlerMethod handlerMethod, RequestMappingInfo mapping) { |
||||
if (mapping.getName() != null) { |
||||
return mapping.getName(); |
||||
} |
||||
StringBuilder sb = new StringBuilder(); |
||||
String simpleTypeName = handlerMethod.getBeanType().getSimpleName(); |
||||
for (int i = 0 ; i < simpleTypeName.length(); i++) { |
||||
if (Character.isUpperCase(simpleTypeName.charAt(i))) { |
||||
sb.append(simpleTypeName.charAt(i)); |
||||
} |
||||
} |
||||
sb.append(SEPARATOR).append(handlerMethod.getMethod().getName()); |
||||
return sb.toString(); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,72 @@
@@ -0,0 +1,72 @@
|
||||
/* |
||||
* Copyright 2002-2014 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.web.servlet.mvc.method; |
||||
|
||||
import org.junit.Test; |
||||
import org.springframework.util.ClassUtils; |
||||
import org.springframework.web.bind.annotation.RequestMapping; |
||||
import org.springframework.web.method.HandlerMethod; |
||||
import org.springframework.web.servlet.handler.HandlerMethodMappingNamingStrategy; |
||||
|
||||
import java.lang.reflect.Method; |
||||
|
||||
import static org.junit.Assert.assertEquals; |
||||
|
||||
/** |
||||
* Unit tests for |
||||
* {@link org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMethodMappingNamingStrategy}. |
||||
* |
||||
* @author Rossen Stoyanchev |
||||
*/ |
||||
public class RequestMappingInfoHandlerMethodMappingNamingStrategyTests { |
||||
|
||||
|
||||
@Test |
||||
public void getNameExplicit() { |
||||
|
||||
Method method = ClassUtils.getMethod(TestController.class, "handle"); |
||||
HandlerMethod handlerMethod = new HandlerMethod(new TestController(), method); |
||||
|
||||
RequestMappingInfo rmi = new RequestMappingInfo("foo", null, null, null, null, null, null, null); |
||||
|
||||
HandlerMethodMappingNamingStrategy strategy = new RequestMappingInfoHandlerMethodMappingNamingStrategy(); |
||||
|
||||
assertEquals("foo", strategy.getName(handlerMethod, rmi)); |
||||
} |
||||
|
||||
@Test |
||||
public void getNameConvention() { |
||||
|
||||
Method method = ClassUtils.getMethod(TestController.class, "handle"); |
||||
HandlerMethod handlerMethod = new HandlerMethod(new TestController(), method); |
||||
|
||||
RequestMappingInfo rmi = new RequestMappingInfo(null, null, null, null, null, null, null, null); |
||||
|
||||
HandlerMethodMappingNamingStrategy strategy = new RequestMappingInfoHandlerMethodMappingNamingStrategy(); |
||||
|
||||
assertEquals("TC#handle", strategy.getName(handlerMethod, rmi)); |
||||
} |
||||
|
||||
|
||||
private static class TestController { |
||||
|
||||
@RequestMapping |
||||
public void handle() { |
||||
} |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue