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 @@ |
|||||||
|
/* |
||||||
|
* 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 @@ |
|||||||
|
/* |
||||||
|
* 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 @@ |
|||||||
|
/* |
||||||
|
* 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 @@ |
|||||||
|
/* |
||||||
|
* 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