本节书摘来自异步社区《Spring攻略(第2版)》一书中的第1章,第1.6节,作者: 【美】Gary Mak , Josh Long , Daniel Rubio著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.6 为集合元素指定数据类型
1.6.1 问题
默认情况下,Spring将集合中所有元素作为字符串对待。如果你不打算将集合元素作为字符串使用,就必须为它们指定数据类型。
1.6.2 解决方案
你可以用标记的type属性指定每个集合元素的数据类型,也可以用集合标记的value-type属性指定所有元素的数据类型。如果你使用Java 1.5或者更高版本,可以定义类型安全的集合,这样Spring将读取集合的类型信息。
1.6.3 工作原理
现在假定你打算接受一系列整数作为序列生成器的前缀。每个数字将由一个java.text. DecimalFormat实例格式化为4位数字。
package com.apress.springrecipes.sequence;
...
public class SequenceGenerator {
...
private List<Object> suffixes;
public void setSuffixes(List<Object> suffixes) {
this.suffixes = suffixes;
}
public synchronized String getSequence() {
StringBuffer buffer = new StringBuffer();
...
DecimalFormat formatter = new DecimalFormat("0000");
for (Object suffix : suffixes) {
buffer.append("-");
buffer.append(formatter.format((Integer) suffix));
}
return buffer.toString();
}
}
然后和往常一样,在Bean配置文件中为你的序列生成器定义多个后缀。
<bean id="sequenceGenerator"
class="com.apress.springrecipes.sequence.SequenceGenerator">
<property name="prefixGenerator" ref="datePrefixGenerator" />
<property name="initial" value="100000" />
<property name="suffixes">
<list>
<value>5</value>
<value>10</value>
<value>20</value>
</list>
</property>
</bean>
但是,当你运行这个应用程序时,将会遇到一个ClassCastException异常,指出后缀不能转换为整数,因为其类型是String。Spring默认将集合中的每个元素作为字符串对待。你必须设置标记的type属性指定元素类型。
<bean id="sequenceGenerator"
class="com.apress.springrecipes.sequence.SequenceGenerator">
...
<property name="suffixes">
<list>
<value type="int">5</value>
<value type="int">10</value>
<value type="int">20</value>
</list>
</property>
</bean>
你也可以设置集合标记的value-type属性指定集合所有元素的类型。
<bean id="sequenceGenerator"
class="com.apress.springrecipes.sequence.SequenceGenerator">
...
<property name="suffixes">
<list value-type="int">
<value>5</value>
<value>10</value>
<value>20</value>
</list>
</property>
</bean>
在Java 1.5或者更高版本中,你可以用存储整数的类型安全集合定义suffixes列表。
package com.apress.springrecipes.sequence;
...
public class SequenceGenerator {
...
private List<Integer> suffixes;
public void setSuffixes(List<Integer> suffixes) {
this.suffixes = suffixes;
}
public synchronized String getSequence() {
StringBuffer buffer = new StringBuffer();
...
DecimalFormat formatter = new DecimalFormat("0000");
for (int suffix : suffixes) {
buffer.append("-");
buffer.append(formatter.format(suffix));
}
return buffer.toString();
}
}
一旦以类型安全的方式定义了集合,Spring就能够通过反射读取集合的类型信息。这样,你就不再需要指定的value-type属性。
<bean id="sequenceGenerator"
class="com.apress.springrecipes.sequence.SequenceGenerator">
...
<property name="suffixes">
<list>
<value>5</value>
<value>10</value>
<value>20</value>
</list>
</property>
</bean>