Add value-type attrib to beans->map->entry element
Previously, the <value> subelement of a map <entry> allowed one to
specify the type of a specific map entry value. This patch allows a
value-type attribute as well, such that instead of the following
syntax
<entry key="x-message-ttl">
<value type="java.lang.Long">100</value>
</entry>
<entry key="x-ha-policy" value="all" />
one can now use the more concise form
<entry key="x-message-ttl" value="100" value-type="java.lang.Long"/>
<entry key="x-ha-policy" value="all"/>
The new value-type attribute may be used at the <map> level as well,
indicating that all elements are of the same type.
Appropriate tests have been added exercising value-type at the <map> and
<entry> levels.
Issue: SPR-9249
This commit is contained in:
committed by
Chris Beams
parent
f3bcb6e2e4
commit
183ac0c1ff
@@ -78,6 +78,7 @@ import org.springframework.util.xml.DomUtils;
|
||||
* @author Juergen Hoeller
|
||||
* @author Rod Johnson
|
||||
* @author Mark Fisher
|
||||
* @author Gary Russell
|
||||
* @since 2.0
|
||||
* @see ParserContext
|
||||
* @see DefaultBeanDefinitionDocumentReader
|
||||
@@ -1302,13 +1303,24 @@ public class BeanDefinitionParserDelegate {
|
||||
Object value = null;
|
||||
boolean hasValueAttribute = entryEle.hasAttribute(VALUE_ATTRIBUTE);
|
||||
boolean hasValueRefAttribute = entryEle.hasAttribute(VALUE_REF_ATTRIBUTE);
|
||||
boolean hasValueTypeAttribute = entryEle.hasAttribute(VALUE_TYPE_ATTRIBUTE);
|
||||
if ((hasValueAttribute && hasValueRefAttribute) ||
|
||||
((hasValueAttribute || hasValueRefAttribute)) && valueEle != null) {
|
||||
error("<entry> element is only allowed to contain either " +
|
||||
"'value' attribute OR 'value-ref' attribute OR <value> sub-element", entryEle);
|
||||
}
|
||||
if ((hasValueTypeAttribute && hasValueRefAttribute) ||
|
||||
(hasValueTypeAttribute && !hasValueAttribute) ||
|
||||
(hasValueTypeAttribute && valueEle != null)) {
|
||||
error("<entry> element is only allowed to contain a 'value-type' " +
|
||||
"attribute when it has a 'value' attribute", entryEle);
|
||||
}
|
||||
if (hasValueAttribute) {
|
||||
value = buildTypedStringValueForMap(entryEle.getAttribute(VALUE_ATTRIBUTE), defaultValueType, entryEle);
|
||||
String valueType = entryEle.getAttribute(VALUE_TYPE_ATTRIBUTE);
|
||||
if (!StringUtils.hasText(valueType)) {
|
||||
valueType = defaultValueType;
|
||||
}
|
||||
value = buildTypedStringValueForMap(entryEle.getAttribute(VALUE_ATTRIBUTE), valueType, entryEle);
|
||||
}
|
||||
else if (hasValueRefAttribute) {
|
||||
String refName = entryEle.getAttribute(VALUE_REF_ATTRIBUTE);
|
||||
|
||||
Reference in New Issue
Block a user