@ -34,6 +34,7 @@ import org.springframework.beans.factory.support.ManagedList;
import org.springframework.beans.factory.support.RootBeanDefinition ;
import org.springframework.beans.factory.xml.BeanDefinitionParser ;
import org.springframework.beans.factory.xml.ParserContext ;
import org.springframework.beans.factory.xml.XmlReaderContext ;
import org.springframework.core.convert.ConversionService ;
import org.springframework.format.support.DefaultFormattingConversionService ;
import org.springframework.format.support.FormattingConversionServiceFactoryBean ;
@ -148,6 +149,10 @@ import org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolv
* /
class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
public static final String HANDLER_MAPPING_BEAN_NAME = RequestMappingHandlerMapping . class . getName ( ) ;
public static final String HANDLER_ADAPTER_BEAN_NAME = RequestMappingHandlerAdapter . class . getName ( ) ;
public static final String CONTENT_NEGOTIATION_MANAGER_BEAN_NAME = "mvcContentNegotiationManager" ;
private static final boolean javaxValidationPresent =
@ -173,6 +178,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
@Override
public BeanDefinition parse ( Element element , ParserContext parserContext ) {
Object source = parserContext . extractSource ( element ) ;
XmlReaderContext readerContext = parserContext . getReaderContext ( ) ;
CompositeComponentDefinition compDefinition = new CompositeComponentDefinition ( element . getTagName ( ) , source ) ;
parserContext . pushContainingComponent ( compDefinition ) ;
@ -184,7 +190,6 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
handlerMappingDef . setRole ( BeanDefinition . ROLE_INFRASTRUCTURE ) ;
handlerMappingDef . getPropertyValues ( ) . add ( "order" , 0 ) ;
handlerMappingDef . getPropertyValues ( ) . add ( "contentNegotiationManager" , contentNegotiationManager ) ;
String methodMappingName = parserContext . getReaderContext ( ) . registerWithGeneratedName ( handlerMappingDef ) ;
if ( element . hasAttribute ( "enable-matrix-variables" ) ) {
Boolean enableMatrixVariables = Boolean . valueOf ( element . getAttribute ( "enable-matrix-variables" ) ) ;
@ -196,6 +201,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
}
configurePathMatchingProperties ( handlerMappingDef , element , parserContext ) ;
readerContext . getRegistry ( ) . registerBeanDefinition ( HANDLER_MAPPING_BEAN_NAME , handlerMappingDef ) ;
RuntimeBeanReference corsConfigurationsRef = MvcNamespaceUtils . registerCorsConfigurations ( null , parserContext , source ) ;
handlerMappingDef . getPropertyValues ( ) . add ( "corsConfigurations" , corsConfigurationsRef ) ;
@ -253,14 +259,14 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
handlerAdapterDef . getPropertyValues ( ) . add ( "callableInterceptors" , callableInterceptors ) ;
handlerAdapterDef . getPropertyValues ( ) . add ( "deferredResultInterceptors" , deferredResultInterceptors ) ;
String handlerAdapterName = parserContext . getReaderContext ( ) . registerWithGeneratedName ( handlerAdapterDef ) ;
readerContext . getRegistry ( ) . registerBeanDefinition ( HANDLER_ADAPTER_BEAN_NAME , handlerAdapterDef ) ;
String uriCompContribName = MvcUriComponentsBuilder . MVC_URI_COMPONENTS_CONTRIBUTOR_BEAN_NAME ;
RootBeanDefinition uriCompContribDef = new RootBeanDefinition ( CompositeUriComponentsContributorFactoryBean . class ) ;
uriCompContribDef . setSource ( source ) ;
uriCompContribDef . getPropertyValues ( ) . addPropertyValue ( "handlerAdapter" , handlerAdapterDef ) ;
uriCompContribDef . getPropertyValues ( ) . addPropertyValue ( "conversionService" , conversionService ) ;
pa rserContext . getR eaderContext( ) . getRegistry ( ) . registerBeanDefinition ( uriCompContribName , uriCompContribDef ) ;
readerContext . getRegistry ( ) . registerBeanDefinition ( uriCompContribName , uriCompContribDef ) ;
RootBeanDefinition csInterceptorDef = new RootBeanDefinition ( ConversionServiceExposingInterceptor . class ) ;
csInterceptorDef . setSource ( source ) ;
@ -270,7 +276,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
mappedCsInterceptorDef . setRole ( BeanDefinition . ROLE_INFRASTRUCTURE ) ;
mappedCsInterceptorDef . getConstructorArgumentValues ( ) . addIndexedArgumentValue ( 0 , ( Object ) null ) ;
mappedCsInterceptorDef . getConstructorArgumentValues ( ) . addIndexedArgumentValue ( 1 , csInterceptorDef ) ;
String mappedInterceptorName = pa rserContext . getR eaderContext( ) . registerWithGeneratedName ( mappedCsInterceptorDef ) ;
String mappedInterceptorName = readerContext . registerWithGeneratedName ( mappedCsInterceptorDef ) ;
RootBeanDefinition exceptionHandlerExceptionResolver = new RootBeanDefinition ( ExceptionHandlerExceptionResolver . class ) ;
exceptionHandlerExceptionResolver . setSource ( source ) ;
@ -280,25 +286,24 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
exceptionHandlerExceptionResolver . getPropertyValues ( ) . add ( "order" , 0 ) ;
addResponseBodyAdvice ( exceptionHandlerExceptionResolver ) ;
String methodExceptionResolverName =
parserContext . getReaderContext ( ) . registerWithGeneratedName ( exceptionHandlerExceptionResolver ) ;
String methodExceptionResolverName = readerContext . registerWithGeneratedName ( exceptionHandlerExceptionResolver ) ;
RootBeanDefinition responseStatusExceptionResolver = new RootBeanDefinition ( ResponseStatusExceptionResolver . class ) ;
responseStatusExceptionResolver . setSource ( source ) ;
responseStatusExceptionResolver . setRole ( BeanDefinition . ROLE_INFRASTRUCTURE ) ;
responseStatusExceptionResolver . getPropertyValues ( ) . add ( "order" , 1 ) ;
String responseStatusExceptionResolverName =
pa rserContext . getR eaderContext( ) . registerWithGeneratedName ( responseStatusExceptionResolver ) ;
readerContext . registerWithGeneratedName ( responseStatusExceptionResolver ) ;
RootBeanDefinition defaultExceptionResolver = new RootBeanDefinition ( DefaultHandlerExceptionResolver . class ) ;
defaultExceptionResolver . setSource ( source ) ;
defaultExceptionResolver . setRole ( BeanDefinition . ROLE_INFRASTRUCTURE ) ;
defaultExceptionResolver . getPropertyValues ( ) . add ( "order" , 2 ) ;
String defaultExceptionResolverName =
pa rserContext . getR eaderContext( ) . registerWithGeneratedName ( defaultExceptionResolver ) ;
readerContext . registerWithGeneratedName ( defaultExceptionResolver ) ;
parserContext . registerComponent ( new BeanComponentDefinition ( handlerMappingDef , methodMappingName ) ) ;
parserContext . registerComponent ( new BeanComponentDefinition ( handlerAdapterDef , handlerAdapterName ) ) ;
parserContext . registerComponent ( new BeanComponentDefinition ( handlerMappingDef , HANDLER_MAPPING_BEAN_NAME ) ) ;
parserContext . registerComponent ( new BeanComponentDefinition ( handlerAdapterDef , HANDLER_ADAPTER_BEAN_NAME ) ) ;
parserContext . registerComponent ( new BeanComponentDefinition ( uriCompContribDef , uriCompContribName ) ) ;
parserContext . registerComponent ( new BeanComponentDefinition ( exceptionHandlerExceptionResolver , methodExceptionResolverName ) ) ;
parserContext . registerComponent ( new BeanComponentDefinition ( responseStatusExceptionResolver , responseStatusExceptionResolverName ) ) ;
@ -361,14 +366,13 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
}
}
private RuntimeBeanReference getContentNegotiationManager ( Element element , Object source , ParserContext parserContext ) {
RuntimeBeanReference contentNegotiationManagerRef ;
private RuntimeBeanReference getContentNegotiationManager ( Element element , Object source ,
ParserContext parserContext ) {
RuntimeBeanReference beanRef ;
if ( element . hasAttribute ( "content-negotiation-manager" ) ) {
String name = element . getAttribute ( "content-negotiation-manager" ) ;
contentNegotiationManagerRef = new RuntimeBeanReference ( name ) ;
if ( ! CONTENT_NEGOTIATION_MANAGER_BEAN_NAME . equals ( name ) ) {
parserContext . getRegistry ( ) . registerAlias ( name , CONTENT_NEGOTIATION_MANAGER_BEAN_NAME ) ;
}
beanRef = new RuntimeBeanReference ( name ) ;
}
else {
RootBeanDefinition factoryBeanDef = new RootBeanDefinition ( ContentNegotiationManagerFactoryBean . class ) ;
@ -379,13 +383,14 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
String name = CONTENT_NEGOTIATION_MANAGER_BEAN_NAME ;
parserContext . getReaderContext ( ) . getRegistry ( ) . registerBeanDefinition ( name , factoryBeanDef ) ;
parserContext . registerComponent ( new BeanComponentDefinition ( factoryBeanDef , name ) ) ;
contentNegotiationManager Ref = new RuntimeBeanReference ( name ) ;
bean Ref = new RuntimeBeanReference ( name ) ;
}
return contentNegotiationManager Ref;
return bean Ref;
}
private void configurePathMatchingProperties ( RootBeanDefinition handlerMappingDef ,
Element element , ParserContext parserContext ) {
private void configurePathMatchingProperties ( RootBeanDefinition handlerMappingDef , Element element ,
ParserContext parserContext ) {
Element pathMatchingElement = DomUtils . getChildElementByTagName ( element , "path-matching" ) ;
if ( pathMatchingElement ! = null ) {
Object source = parserContext . extractSource ( element ) ;