diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/AbstractStepParser.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/AbstractStepParser.java index ace7157e6..fce7c2b5e 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/AbstractStepParser.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/AbstractStepParser.java @@ -127,7 +127,6 @@ public abstract class AbstractStepParser { } - @SuppressWarnings("unchecked") protected void setUpBeanDefinition(Element stepElement, AbstractBeanDefinition bd, ParserContext parserContext, String jobRepositoryRef) { checkStepAttributes(stepElement, bd); @@ -141,6 +140,22 @@ public abstract class AbstractStepParser { RuntimeBeanReference transactionManagerBeanRef = new RuntimeBeanReference(transactionManagerRef); bd.getPropertyValues().addPropertyValue("transactionManager", transactionManagerBeanRef); + handleTransactionAttributesElement(stepElement, bd, parserContext); + + handleListenersElement(stepElement, bd, parserContext); + + handleExceptionElement(stepElement, parserContext, bd, "no-rollback-exception-classes", + "noRollbackExceptionClasses"); + + bd.setRole(BeanDefinition.ROLE_SUPPORT); + + bd.setSource(parserContext.extractSource(stepElement)); + + } + + private void handleTransactionAttributesElement(Element stepElement, AbstractBeanDefinition bd, + ParserContext parserContext) { + @SuppressWarnings("unchecked") List txAttrElements = DomUtils.getChildElementsByTagName(stepElement, TX_ATTRIBUTES_ELE); if (txAttrElements.size() == 1) { Element txAttrElement = txAttrElements.get(0); @@ -159,26 +174,17 @@ public abstract class AbstractStepParser { } else if (txAttrElements.size() > 1) { parserContext.getReaderContext().error( - "The '" + TX_ATTRIBUTES_ELE + "' element may not appear more than once in a single <" + "The <" + TX_ATTRIBUTES_ELE + "/> element may not appear more than once in a single <" + stepElement.getNodeName() + "/>.", stepElement); } - - handleListenersElement(stepElement, bd, parserContext); - - handleExceptionElement(stepElement, parserContext, bd, "no-rollback-exception-classes", - "noRollbackExceptionClasses"); - - bd.setRole(BeanDefinition.ROLE_SUPPORT); - - bd.setSource(parserContext.extractSource(stepElement)); - } @SuppressWarnings("unchecked") - private void handleExceptionElement(Element element, ParserContext parserContext, BeanDefinition bd, + public static void handleExceptionElement(Element element, ParserContext parserContext, BeanDefinition bd, String subElementName, String propertyName) { - Element child = DomUtils.getChildElementByTagName(element, subElementName); - if (child != null) { + List children = DomUtils.getChildElementsByTagName(element, subElementName); + if (children.size() == 1) { + Element child = children.get(0); String exceptions = DomUtils.getTextValue(child); if (StringUtils.hasLength(exceptions)) { String[] exceptionArray = StringUtils.tokenizeToStringArray(exceptions, ",\n"); @@ -190,6 +196,12 @@ public abstract class AbstractStepParser { } } } + else if (children.size() > 1) { + parserContext.getReaderContext().error( + "The <" + subElementName + "/> element may not appear more than once in a single <" + + element.getNodeName() + "/>.", element); + } + } private void checkStepAttributes(Element stepElement, AbstractBeanDefinition bd) { @@ -228,7 +240,7 @@ public abstract class AbstractStepParser { } else if (listenersElements.size() > 1) { parserContext.getReaderContext().error( - "The '" + LISTENERS_ELE + "' element may not appear more than once in a single <" + "The <" + LISTENERS_ELE + "/> element may not appear more than once in a single <" + stepElement.getNodeName() + "/>.", stepElement); } } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/JobParser.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/JobParser.java index 12b02d202..754a9ebdb 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/JobParser.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/JobParser.java @@ -109,7 +109,7 @@ public class JobParser extends AbstractSingleBeanDefinitionParser { } else if (listenersElements.size() > 1) { parserContext.getReaderContext().error( - "The 'listeners' element may not appear more than once in a single .", element); + "The '' element may not appear more than once in a single .", element); } } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/TaskletElementParser.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/TaskletElementParser.java index 1d39528d2..8ae6d3f32 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/TaskletElementParser.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/TaskletElementParser.java @@ -15,7 +15,8 @@ */ package org.springframework.batch.core.configuration.xml; -import java.util.Arrays; +import static org.springframework.batch.core.configuration.xml.AbstractStepParser.handleExceptionElement; + import java.util.List; import org.springframework.beans.MutablePropertyValues; @@ -143,24 +144,6 @@ public class TaskletElementParser { } - @SuppressWarnings("unchecked") - private void handleExceptionElement(Element element, ParserContext parserContext, BeanDefinition bd, - String subElementName, String propertyName) { - Element child = DomUtils.getChildElementByTagName(element, subElementName); - if (child != null) { - String exceptions = DomUtils.getTextValue(child); - if (StringUtils.hasLength(exceptions)) { - String[] exceptionArray = StringUtils.tokenizeToStringArray(exceptions, ",\n"); - if (exceptionArray.length > 0) { - ManagedList managedList = new ManagedList(); - managedList.setMergeEnabled(Boolean.valueOf(child.getAttribute(MERGE_ATTR))); - managedList.addAll(Arrays.asList(exceptionArray)); - bd.getPropertyValues().addPropertyValue(propertyName, managedList); - } - } - } - } - private void handleRetryListenersElement(Element element, BeanDefinition bd, ParserContext parserContext) { Element listenersElement = DomUtils.getChildElementByTagName(element, "retry-listeners"); if (listenersElement != null) { diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/configuration/xml/spring-batch-2.0.xsd b/spring-batch-core/src/main/resources/org/springframework/batch/core/configuration/xml/spring-batch-2.0.xsd index f79f7ec78..87a4f6375 100644 --- a/spring-batch-core/src/main/resources/org/springframework/batch/core/configuration/xml/spring-batch-2.0.xsd +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/configuration/xml/spring-batch-2.0.xsd @@ -289,7 +289,7 @@ - + + The transaction propagation behavior. + ]]> @@ -332,8 +332,8 @@ + The transaction isolation level. + ]]>