BATCH-1633: fix bean parsers for inner bean corner cases
This commit is contained in:
@@ -6,6 +6,7 @@ import java.util.List;
|
||||
import org.springframework.batch.core.listener.AbstractListenerFactoryBean;
|
||||
import org.springframework.batch.core.listener.ListenerMetaData;
|
||||
import org.springframework.beans.BeanMetadataElement;
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.beans.factory.config.BeanDefinitionHolder;
|
||||
import org.springframework.beans.factory.config.RuntimeBeanReference;
|
||||
import org.springframework.beans.factory.support.AbstractBeanDefinition;
|
||||
@@ -40,7 +41,7 @@ public abstract class AbstractListenerParser {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
|
||||
builder.addPropertyValue("delegate", parseListenerElement(element, parserContext));
|
||||
builder.addPropertyValue("delegate", parseListenerElement(element, parserContext, builder.getRawBeanDefinition()));
|
||||
|
||||
ManagedMap metaDataMap = new ManagedMap();
|
||||
for (String metaDataPropertyName : getMethodNameAttributes()) {
|
||||
@@ -53,7 +54,7 @@ public abstract class AbstractListenerParser {
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static BeanMetadataElement parseListenerElement(Element element, ParserContext parserContext) {
|
||||
public static BeanMetadataElement parseListenerElement(Element element, ParserContext parserContext, BeanDefinition enclosing) {
|
||||
String listenerRef = element.getAttribute(REF_ATTR);
|
||||
List<Element> beanElements = DomUtils.getChildElementsByTagName(element, BEAN_ELE);
|
||||
List<Element> refElements = DomUtils.getChildElementsByTagName(element, REF_ELE);
|
||||
@@ -66,7 +67,7 @@ public abstract class AbstractListenerParser {
|
||||
else if (beanElements.size() == 1) {
|
||||
Element beanElement = beanElements.get(0);
|
||||
BeanDefinitionHolder beanDefinitionHolder = parserContext.getDelegate().parseBeanDefinitionElement(
|
||||
beanElement);
|
||||
beanElement, enclosing);
|
||||
parserContext.getDelegate().decorateBeanDefinitionIfRequired(beanElement, beanDefinitionHolder);
|
||||
return beanDefinitionHolder;
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ package org.springframework.batch.core.configuration.xml;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.beans.MutablePropertyValues;
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.beans.factory.config.BeanDefinitionHolder;
|
||||
import org.springframework.beans.factory.config.RuntimeBeanReference;
|
||||
import org.springframework.beans.factory.config.TypedStringValue;
|
||||
@@ -137,7 +138,7 @@ public class ChunkElementParser {
|
||||
handleExceptionElement(element, parserContext, propertyValues, "retryable-exception-classes",
|
||||
"retryableExceptionClasses");
|
||||
|
||||
handleRetryListenersElement(element, propertyValues, parserContext);
|
||||
handleRetryListenersElement(element, propertyValues, parserContext, bd);
|
||||
|
||||
handleStreamsElement(element, propertyValues, parserContext);
|
||||
|
||||
@@ -229,7 +230,7 @@ public class ChunkElementParser {
|
||||
}
|
||||
|
||||
private void handleRetryListenersElement(Element element, MutablePropertyValues propertyValues,
|
||||
ParserContext parserContext) {
|
||||
ParserContext parserContext, BeanDefinition enclosing) {
|
||||
Element listenersElement = DomUtils.getChildElementByTagName(element, "retry-listeners");
|
||||
if (listenersElement != null) {
|
||||
CompositeComponentDefinition compositeDef = new CompositeComponentDefinition(listenersElement.getTagName(),
|
||||
@@ -238,18 +239,18 @@ public class ChunkElementParser {
|
||||
ManagedList retryListenerBeans = new ManagedList();
|
||||
retryListenerBeans.setMergeEnabled(listenersElement.hasAttribute(MERGE_ATTR)
|
||||
&& Boolean.valueOf(listenersElement.getAttribute(MERGE_ATTR)));
|
||||
handleRetryListenerElements(parserContext, listenersElement, retryListenerBeans);
|
||||
handleRetryListenerElements(parserContext, listenersElement, retryListenerBeans, enclosing);
|
||||
propertyValues.addPropertyValue("retryListeners", retryListenerBeans);
|
||||
parserContext.popAndRegisterContainingComponent();
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void handleRetryListenerElements(ParserContext parserContext, Element element, ManagedList beans) {
|
||||
private void handleRetryListenerElements(ParserContext parserContext, Element element, ManagedList beans, BeanDefinition enclosing) {
|
||||
List<Element> listenerElements = DomUtils.getChildElementsByTagName(element, "listener");
|
||||
if (listenerElements != null) {
|
||||
for (Element listenerElement : listenerElements) {
|
||||
beans.add(AbstractListenerParser.parseListenerElement(listenerElement, parserContext));
|
||||
beans.add(AbstractListenerParser.parseListenerElement(listenerElement, parserContext, enclosing));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,7 +93,7 @@ public class TaskletParser {
|
||||
}
|
||||
else if (beanElements.size() == 1) {
|
||||
Element beanElement = beanElements.get(0);
|
||||
BeanDefinitionHolder beanDefinitionHolder = parserContext.getDelegate().parseBeanDefinitionElement(beanElement);
|
||||
BeanDefinitionHolder beanDefinitionHolder = parserContext.getDelegate().parseBeanDefinitionElement(beanElement, bd);
|
||||
parserContext.getDelegate().decorateBeanDefinitionIfRequired(beanElement, beanDefinitionHolder);
|
||||
bme = beanDefinitionHolder;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user