|
19 | 19 | import java.util.List; |
20 | 20 | import java.util.Properties; |
21 | 21 |
|
| 22 | +import org.springframework.beans.factory.FactoryBean; |
| 23 | +import org.springframework.beans.factory.InitializingBean; |
22 | 24 | import org.springframework.beans.factory.config.BeanDefinition; |
23 | 25 | import org.springframework.beans.factory.config.BeanDefinitionHolder; |
24 | 26 | import org.springframework.beans.factory.config.RuntimeBeanReference; |
|
28 | 30 | import org.springframework.beans.factory.support.RootBeanDefinition; |
29 | 31 | import org.springframework.beans.factory.xml.BeanDefinitionParser; |
30 | 32 | import org.springframework.beans.factory.xml.ParserContext; |
| 33 | +import org.springframework.core.convert.ConversionService; |
31 | 34 | import org.springframework.format.support.DefaultFormattingConversionService; |
32 | 35 | import org.springframework.format.support.FormattingConversionServiceFactoryBean; |
33 | 36 | import org.springframework.http.MediaType; |
|
52 | 55 | import org.springframework.web.bind.annotation.ResponseStatus; |
53 | 56 | import org.springframework.web.bind.support.ConfigurableWebBindingInitializer; |
54 | 57 | import org.springframework.web.bind.support.WebArgumentResolver; |
| 58 | +import org.springframework.web.method.support.CompositeUriComponentsContributor; |
55 | 59 | import org.springframework.web.servlet.HandlerAdapter; |
56 | 60 | import org.springframework.web.servlet.HandlerExceptionResolver; |
57 | 61 | import org.springframework.web.servlet.HandlerMapping; |
|
67 | 71 | import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; |
68 | 72 | import org.springframework.web.servlet.mvc.method.annotation.ServletWebArgumentResolverAdapter; |
69 | 73 | import org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver; |
| 74 | +import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder; |
70 | 75 | import org.w3c.dom.Element; |
71 | 76 |
|
72 | 77 | /** |
@@ -207,12 +212,12 @@ public BeanDefinition parse(Element element, ParserContext parserContext) { |
207 | 212 | handlerAdapterDef.getPropertyValues().add("deferredResultInterceptors", deferredResultInterceptors); |
208 | 213 | String handlerAdapterName = parserContext.getReaderContext().registerWithGeneratedName(handlerAdapterDef); |
209 | 214 |
|
210 | | - String mvcUrlsName = "mvcUrls"; |
211 | | - RootBeanDefinition mvcUrlsDef = new RootBeanDefinition(DefaultMvcUrlsFactoryBean.class); |
212 | | - mvcUrlsDef.setSource(source); |
213 | | - mvcUrlsDef.getPropertyValues().addPropertyValue("handlerAdapter", handlerAdapterDef); |
214 | | - mvcUrlsDef.getPropertyValues().addPropertyValue("conversionService", conversionService); |
215 | | - parserContext.getReaderContext().getRegistry().registerBeanDefinition(mvcUrlsName, mvcUrlsDef); |
| 215 | + String uriCompContribName = MvcUriComponentsBuilder.MVC_URI_COMPONENTS_CONTRIBUTOR_BEAN_NAME; |
| 216 | + RootBeanDefinition uriCompContribDef = new RootBeanDefinition(CompositeUriComponentsContributorFactoryBean.class); |
| 217 | + uriCompContribDef.setSource(source); |
| 218 | + uriCompContribDef.getPropertyValues().addPropertyValue("handlerAdapter", handlerAdapterDef); |
| 219 | + uriCompContribDef.getPropertyValues().addPropertyValue("conversionService", conversionService); |
| 220 | + parserContext.getReaderContext().getRegistry().registerBeanDefinition(uriCompContribName, uriCompContribDef); |
216 | 221 |
|
217 | 222 | RootBeanDefinition csInterceptorDef = new RootBeanDefinition(ConversionServiceExposingInterceptor.class); |
218 | 223 | csInterceptorDef.setSource(source); |
@@ -249,7 +254,7 @@ public BeanDefinition parse(Element element, ParserContext parserContext) { |
249 | 254 |
|
250 | 255 | parserContext.registerComponent(new BeanComponentDefinition(handlerMappingDef, methodMappingName)); |
251 | 256 | parserContext.registerComponent(new BeanComponentDefinition(handlerAdapterDef, handlerAdapterName)); |
252 | | - parserContext.registerComponent(new BeanComponentDefinition(mvcUrlsDef, mvcUrlsName)); |
| 257 | + parserContext.registerComponent(new BeanComponentDefinition(uriCompContribDef, uriCompContribName)); |
253 | 258 | parserContext.registerComponent(new BeanComponentDefinition(exceptionHandlerExceptionResolver, methodExceptionResolverName)); |
254 | 259 | parserContext.registerComponent(new BeanComponentDefinition(responseStatusExceptionResolver, responseStatusExceptionResolverName)); |
255 | 260 | parserContext.registerComponent(new BeanComponentDefinition(defaultExceptionResolver, defaultExceptionResolverName)); |
@@ -484,4 +489,50 @@ private ManagedList<BeanDefinitionHolder> wrapWebArgumentResolverBeanDefs(List<B |
484 | 489 | return result; |
485 | 490 | } |
486 | 491 |
|
| 492 | + |
| 493 | + /** |
| 494 | + * A FactoryBean for a CompositeUriComponentsContributor that obtains the |
| 495 | + * HandlerMethodArgumentResolver's configured in RequestMappingHandlerAdapter |
| 496 | + * after it is fully initialized. |
| 497 | + */ |
| 498 | + private static class CompositeUriComponentsContributorFactoryBean |
| 499 | + implements InitializingBean, FactoryBean<CompositeUriComponentsContributor> { |
| 500 | + |
| 501 | + private RequestMappingHandlerAdapter handlerAdapter; |
| 502 | + |
| 503 | + private ConversionService conversionService; |
| 504 | + |
| 505 | + private CompositeUriComponentsContributor uriComponentsContributor; |
| 506 | + |
| 507 | + |
| 508 | + public void setHandlerAdapter(RequestMappingHandlerAdapter handlerAdapter) { |
| 509 | + this.handlerAdapter = handlerAdapter; |
| 510 | + } |
| 511 | + |
| 512 | + public void setConversionService(ConversionService conversionService) { |
| 513 | + this.conversionService = conversionService; |
| 514 | + } |
| 515 | + |
| 516 | + @Override |
| 517 | + public void afterPropertiesSet() throws Exception { |
| 518 | + this.uriComponentsContributor = new CompositeUriComponentsContributor( |
| 519 | + this.handlerAdapter.getArgumentResolvers(), this.conversionService); |
| 520 | + } |
| 521 | + |
| 522 | + @Override |
| 523 | + public CompositeUriComponentsContributor getObject() throws Exception { |
| 524 | + return this.uriComponentsContributor; |
| 525 | + } |
| 526 | + |
| 527 | + @Override |
| 528 | + public Class<?> getObjectType() { |
| 529 | + return CompositeUriComponentsContributor.class; |
| 530 | + } |
| 531 | + |
| 532 | + @Override |
| 533 | + public boolean isSingleton() { |
| 534 | + return true; |
| 535 | + } |
| 536 | + } |
| 537 | + |
487 | 538 | } |
0 commit comments