STS-723: fixed ViewControllerBeanDefinitionParser to not rely on instance state for handler mapping and handler adapter bean names
This commit is contained in:
parent
4160fc85f2
commit
f3274624b3
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue