@ -163,28 +163,11 @@ public class MvcUriComponentsBuilder extends UriComponentsBuilder {
@@ -163,28 +163,11 @@ public class MvcUriComponentsBuilder extends UriComponentsBuilder {
* @return a UriComponentsBuilder instance ( never { @code null } )
* /
public static UriComponentsBuilder fromController ( UriComponentsBuilder builder , Class < ? > controllerType ) {
if ( builder ! = null ) {
builder = ( UriComponentsBuilder ) builder . clone ( ) ;
}
else {
builder = ServletUriComponentsBuilder . fromCurrentServletMapping ( ) ;
}
builder = getBaseUrlToUse ( builder ) ;
String mapping = getTypeRequestMapping ( controllerType ) ;
return builder . path ( mapping ) ;
}
private static String getTypeRequestMapping ( Class < ? > controllerType ) {
Assert . notNull ( controllerType , "'controllerType' must not be null" ) ;
RequestMapping annot = AnnotationUtils . findAnnotation ( controllerType , RequestMapping . class ) ;
if ( annot = = null | | ObjectUtils . isEmpty ( annot . value ( ) ) | | StringUtils . isEmpty ( annot . value ( ) [ 0 ] ) ) {
return "/" ;
}
if ( annot . value ( ) . length > 1 & & logger . isWarnEnabled ( ) ) {
logger . warn ( "Multiple paths on controller " + controllerType . getName ( ) + ", using first one" ) ;
}
return annot . value ( ) [ 0 ] ;
}
/ * *
* Create a { @link UriComponentsBuilder } from the mapping of a controller
* method and an array of method argument values . This method delegates
@ -221,24 +204,6 @@ public class MvcUriComponentsBuilder extends UriComponentsBuilder {
@@ -221,24 +204,6 @@ public class MvcUriComponentsBuilder extends UriComponentsBuilder {
return fromMethod ( builder , method , args ) ;
}
private static Method getMethod ( Class < ? > controllerType , String methodName , Object . . . args ) {
Method match = null ;
for ( Method method : controllerType . getDeclaredMethods ( ) ) {
if ( method . getName ( ) . equals ( methodName ) & & method . getParameterTypes ( ) . length = = args . length ) {
if ( match ! = null ) {
throw new IllegalArgumentException ( "Found two methods named '" + methodName + "' having " +
Arrays . asList ( args ) + " arguments, controller " + controllerType . getName ( ) ) ;
}
match = method ;
}
}
if ( match = = null ) {
throw new IllegalArgumentException ( "No method '" + methodName + "' with " + args . length +
" parameters found in " + controllerType . getName ( ) ) ;
}
return match ;
}
/ * *
* Create a { @link UriComponentsBuilder } by invoking a "mock" controller method .
* The controller method and the supplied argument values are then used to
@ -352,21 +317,21 @@ public class MvcUriComponentsBuilder extends UriComponentsBuilder {
@@ -352,21 +317,21 @@ public class MvcUriComponentsBuilder extends UriComponentsBuilder {
* request or to apply a custom baseUrl not matching the current request .
* @param builder the builder for the base URL ; the builder will be cloned
* and therefore not modified and may be re - used for further calls .
* @param mappi ngN ame the mapping name
* @param name the mapping name
* @return a builder to to prepare the URI String
* @throws IllegalArgumentException if the mapping name is not found or
* if there is no unique match
* @since 4 . 2
* /
public static MethodArgumentBuilder fromMappingName ( UriComponentsBuilder builder , String mappi ngN ame) {
public static MethodArgumentBuilder fromMappingName ( UriComponentsBuilder builder , String name ) {
RequestMappingInfoHandlerMapping handlerMapping = getRequestMappingInfoHandlerMapping ( ) ;
List < HandlerMethod > handlerMethods = handlerMapping . getHandlerMethodsForMappingName ( mappi ngN ame) ;
List < HandlerMethod > handlerMethods = handlerMapping . getHandlerMethodsForMappingName ( name ) ;
if ( handlerMethods = = null ) {
throw new IllegalArgumentException ( "Mapping mappingName not found: " + mappi ngN ame) ;
throw new IllegalArgumentException ( "Mapping mappingName not found: " + name ) ;
}
if ( handlerMethods . size ( ) ! = 1 ) {
throw new IllegalArgumentException (
"No unique match for mapping mappingName " + mappingN ame + ": " + handlerMethods ) ;
throw new IllegalArgumentException ( "No unique match for mapping mappingName " +
n ame + ": " + handlerMethods ) ;
}
return new MethodArgumentBuilder ( builder , handlerMethods . get ( 0 ) . getMethod ( ) ) ;
}
@ -393,27 +358,61 @@ public class MvcUriComponentsBuilder extends UriComponentsBuilder {
@@ -393,27 +358,61 @@ public class MvcUriComponentsBuilder extends UriComponentsBuilder {
* This is useful when using MvcUriComponentsBuilder outside the context of
* processing a request or to apply a custom baseUrl not matching the
* current request .
* @param builder the builder for the base URL ; the builder will be cloned
* @param baseUrl the builder for the base URL ; the builder will be cloned
* and therefore not modified and may be re - used for further calls .
* @param method the controller method
* @param args argument values for the controller method
* @return a UriComponentsBuilder instance , never { @code null }
* /
public static UriComponentsBuilder fromMethod ( UriComponentsBuilder builder , Method method , Object . . . args ) {
if ( builder ! = null ) {
builder = ( UriComponentsBuilder ) builder . clone ( ) ;
}
else {
builder = ServletUriComponentsBuilder . fromCurrentServletMapping ( ) ;
}
public static UriComponentsBuilder fromMethod ( UriComponentsBuilder baseUrl , Method method , Object . . . args ) {
baseUrl = getBaseUrlToUse ( baseUrl ) ;
String typePath = getTypeRequestMapping ( method . getDeclaringClass ( ) ) ;
String methodPath = getMethodRequestMapping ( method ) ;
String path = pathMatcher . combine ( typePath , methodPath ) ;
builder . path ( path ) ;
UriComponents uriComponents = applyContributors ( builder , method , args ) ;
baseUrl . path ( path ) ;
UriComponents uriComponents = applyContributors ( baseUrl , method , args ) ;
return UriComponentsBuilder . newInstance ( ) . uriComponents ( uriComponents ) ;
}
private static UriComponentsBuilder getBaseUrlToUse ( UriComponentsBuilder baseUrl ) {
if ( baseUrl ! = null ) {
return ( UriComponentsBuilder ) baseUrl . clone ( ) ;
}
else {
return ServletUriComponentsBuilder . fromCurrentServletMapping ( ) ;
}
}
private static String getTypeRequestMapping ( Class < ? > controllerType ) {
Assert . notNull ( controllerType , "'controllerType' must not be null" ) ;
RequestMapping annot = AnnotationUtils . findAnnotation ( controllerType , RequestMapping . class ) ;
if ( annot = = null | | ObjectUtils . isEmpty ( annot . value ( ) ) | | StringUtils . isEmpty ( annot . value ( ) [ 0 ] ) ) {
return "/" ;
}
if ( annot . value ( ) . length > 1 & & logger . isWarnEnabled ( ) ) {
logger . warn ( "Multiple paths on controller " + controllerType . getName ( ) + ", using first one" ) ;
}
return annot . value ( ) [ 0 ] ;
}
private static Method getMethod ( Class < ? > controllerType , String methodName , Object . . . args ) {
Method match = null ;
for ( Method method : controllerType . getDeclaredMethods ( ) ) {
if ( method . getName ( ) . equals ( methodName ) & & method . getParameterTypes ( ) . length = = args . length ) {
if ( match ! = null ) {
throw new IllegalArgumentException ( "Found two methods named '" + methodName + "' having " +
Arrays . asList ( args ) + " arguments, controller " + controllerType . getName ( ) ) ;
}
match = method ;
}
}
if ( match = = null ) {
throw new IllegalArgumentException ( "No method '" + methodName + "' with " + args . length +
" parameters found in " + controllerType . getName ( ) ) ;
}
return match ;
}
private static String getMethodRequestMapping ( Method method ) {
RequestMapping annot = AnnotationUtils . findAnnotation ( method , RequestMapping . class ) ;
if ( annot = = null ) {