STS-723: fixed ViewControllerBeanDefinitionParser to not rely on instance state for handler mapping and handler adapter bean names

This commit is contained in:
Christian Dupuis 2009-12-22 16:52:33 +00:00
parent 4160fc85f2
commit f3274624b3
1 changed files with 37 additions and 20 deletions

View File

@ -34,34 +34,27 @@ import org.w3c.dom.Element;
* a {@link ParameterizableViewController}. Will also register a {@link SimpleUrlHandlerMapping} for view controllers. * a {@link ParameterizableViewController}. Will also register a {@link SimpleUrlHandlerMapping} for view controllers.
* *
* @author Keith Donald * @author Keith Donald
* @author Christian Dupuis
* @since 3.0 * @since 3.0
*/ */
class ViewControllerBeanDefinitionParser implements BeanDefinitionParser { 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) { public BeanDefinition parse(Element element, ParserContext parserContext) {
Object source = parserContext.extractSource(element); Object source = parserContext.extractSource(element);
if (this.handlerAdapterBeanName == null) {
RootBeanDefinition handlerAdapterDef = new RootBeanDefinition(SimpleControllerHandlerAdapter.class); // Register handler adapter
handlerAdapterDef.setSource(source); registerHanderAdapter(element, parserContext, source);
handlerAdapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
this.handlerAdapterBeanName = parserContext.getReaderContext().registerWithGeneratedName(handlerAdapterDef); // Register handler mapping
parserContext.registerComponent(new BeanComponentDefinition(handlerAdapterDef, handlerAdapterBeanName)); BeanDefinition handlerMappingDef = registerHandlerMapping(element, parserContext, source);
}
RootBeanDefinition handlerMappingDef; // Create view controller bean definition
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);
}
RootBeanDefinition viewControllerDef = new RootBeanDefinition(ParameterizableViewController.class); RootBeanDefinition viewControllerDef = new RootBeanDefinition(ParameterizableViewController.class);
viewControllerDef.setSource(source); viewControllerDef.setSource(source);
if (element.hasAttribute("view-name")) { if (element.hasAttribute("view-name")) {
@ -78,4 +71,28 @@ class ViewControllerBeanDefinitionParser implements BeanDefinitionParser {
return null; 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);
}
}
} }