From f3274624b3b018e900b47c45b86d2383a3a6da47 Mon Sep 17 00:00:00 2001 From: Christian Dupuis Date: Tue, 22 Dec 2009 16:52:33 +0000 Subject: [PATCH] STS-723: fixed ViewControllerBeanDefinitionParser to not rely on instance state for handler mapping and handler adapter bean names --- .../ViewControllerBeanDefinitionParser.java | 57 ++++++++++++------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/ViewControllerBeanDefinitionParser.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/ViewControllerBeanDefinitionParser.java index 53daa67782..8f88d36d18 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/ViewControllerBeanDefinitionParser.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/ViewControllerBeanDefinitionParser.java @@ -34,34 +34,27 @@ import org.w3c.dom.Element; * a {@link ParameterizableViewController}. Will also register a {@link SimpleUrlHandlerMapping} for view controllers. * * @author Keith Donald + * @author Christian Dupuis * @since 3.0 */ class ViewControllerBeanDefinitionParser implements BeanDefinitionParser { - private String handlerAdapterBeanName; + private static final String HANDLER_ADAPTER_BEAN_NAME = + "org.springframework.web.servlet.config.internalHandlerAdapter"; - private String handlerMappingBeanName; + private static final String HANDLER_MAPPING_BEAN_NAME = + "org.springframework.web.servlet.config.internalHandlerMapping"; public BeanDefinition parse(Element element, ParserContext parserContext) { Object source = parserContext.extractSource(element); - if (this.handlerAdapterBeanName == null) { - RootBeanDefinition handlerAdapterDef = new RootBeanDefinition(SimpleControllerHandlerAdapter.class); - handlerAdapterDef.setSource(source); - handlerAdapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - this.handlerAdapterBeanName = parserContext.getReaderContext().registerWithGeneratedName(handlerAdapterDef); - parserContext.registerComponent(new BeanComponentDefinition(handlerAdapterDef, handlerAdapterBeanName)); - } - RootBeanDefinition handlerMappingDef; - if (this.handlerMappingBeanName == null) { - handlerMappingDef = new RootBeanDefinition(SimpleUrlHandlerMapping.class); - handlerMappingDef.setSource(source); - handlerMappingDef.getPropertyValues().add("order", "1"); - handlerMappingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - this.handlerMappingBeanName = parserContext.getReaderContext().registerWithGeneratedName(handlerMappingDef); - parserContext.registerComponent(new BeanComponentDefinition(handlerMappingDef, handlerMappingBeanName)); - } else { - handlerMappingDef = (RootBeanDefinition) parserContext.getReaderContext().getRegistry().getBeanDefinition(this.handlerMappingBeanName); - } + + // Register handler adapter + registerHanderAdapter(element, parserContext, source); + + // Register handler mapping + BeanDefinition handlerMappingDef = registerHandlerMapping(element, parserContext, source); + + // Create view controller bean definition RootBeanDefinition viewControllerDef = new RootBeanDefinition(ParameterizableViewController.class); viewControllerDef.setSource(source); if (element.hasAttribute("view-name")) { @@ -78,4 +71,28 @@ class ViewControllerBeanDefinitionParser implements BeanDefinitionParser { return null; } + private void registerHanderAdapter(Element element, ParserContext parserContext, Object source) { + if (!parserContext.getRegistry().containsBeanDefinition(HANDLER_ADAPTER_BEAN_NAME)) { + RootBeanDefinition handlerAdapterDef = new RootBeanDefinition(SimpleControllerHandlerAdapter.class); + handlerAdapterDef.setSource(source); + handlerAdapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + parserContext.getRegistry().registerBeanDefinition(HANDLER_ADAPTER_BEAN_NAME, handlerAdapterDef); + parserContext.registerComponent(new BeanComponentDefinition(handlerAdapterDef, HANDLER_ADAPTER_BEAN_NAME)); + } + } + + private BeanDefinition registerHandlerMapping(Element element, ParserContext parserContext, Object source) { + if (!parserContext.getRegistry().containsBeanDefinition(HANDLER_MAPPING_BEAN_NAME)) { + RootBeanDefinition handlerMappingDef = new RootBeanDefinition(SimpleUrlHandlerMapping.class); + handlerMappingDef.setSource(source); + handlerMappingDef.getPropertyValues().add("order", "1"); + handlerMappingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + parserContext.getRegistry().registerBeanDefinition(HANDLER_MAPPING_BEAN_NAME, handlerMappingDef); + parserContext.registerComponent(new BeanComponentDefinition(handlerMappingDef, HANDLER_MAPPING_BEAN_NAME)); + return handlerMappingDef; + } + else { + return parserContext.getRegistry().getBeanDefinition(HANDLER_MAPPING_BEAN_NAME); + } + } }