Spring入门学习——为集合元素指定数据类型

默认情况下,Spring将集合中所有元素作为字符串对待,如果不打算将集合元素作为字符串使用,就必须为它们指定数据类型。
解决方案:
(1)使用<value>标记的type属性指定每个集合元素的数据类型
(2)用集合标记的value-type属性指定所有元素的数据类型

实验场景:在之前的序列号生成基础上,将后缀规则改为接收一系列整数,每个数字将由一个java.text.DecimalFormat实例格式化为4个数字。

package com.cgy.springrecipes.sequence;

import java.text.DecimalFormat;
import java.util.List;

public class SequenceGenerator {
private PrefixGenerator prefixGenerator; //PrefixGenerator类代码在前面博客
private List<Object> suffixes;
private int initial;
private int counter;

public SequenceGenerator() {}

public SequenceGenerator(PrefixGenerator prefixGenerator) {
this.prefixGenerator = prefixGenerator;
}

public void setPrefixGenerator(PrefixGenerator prefixGenerator) {
this.prefixGenerator = prefixGenerator;
}

public void setSuffixes(List<Object> suffixes) {
this.suffixes = suffixes;
}

public void setInitial(int initial) {
this.initial = initial;
}

public synchronized String getSequence() {
StringBuffer buffer = new StringBuffer();
buffer.append(prefixGenerator.getPrefix());
buffer.append(initial + counter++);
DecimalFormat formatter = new DecimalFormat("0000");
for(Object suffix : suffixes) {
buffer.append("-");
buffer.append(formatter.format( (Integer)suffix) );
}
return buffer.toString();
}
}



<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<bean id="sequenceGenerator" class="com.cgy.springrecipes.sequence.SequenceGenerator">
<constructor-arg>
<bean class="com.cgy.springrecipes.sequence.DatePrefixGenerator">
<property name="pattern" value="yyyyMMdd"/>
</bean>
</constructor-arg>
<property name="suffixes">
<list>
<value>5</value>
<value>10</value>
<value>20</value>
</list>
</property>
<property name="initial" value="10000"/>
</bean>
</beans>

运行发现,黄色高亮的代码行报错,java.lang.ClassCastException,其原因是Bean配置文件中,默认集合元素的类型都是String,因此当试图转为Integer时失败,此时正需要指定元素类型。

<property name="suffixes">
<list>
<value type="int">5</value>
<value type="int">10</value>
<value type="int">20</value>
</list>
</property>

使用<value>标记的type属性指定元素类型为int,运行成功,输出:
2017033110000-0005-0010-0020
2017033110001-0005-0010-0020

或者使用在集合标记中使用value-type指定所有元素的数据类型达到同样效果

<property name="suffixes">
<list value-type="int">
<value>5</value>
<value>10</value>
<value>20</value>
</list>
</property>

在Java1.5以及更高的的版本上,可以用存储整数的类型安全集合定义suffixes

private List<Integer> suffixes;

Spring将通过反射读取集合的类型信息,不再需要指定集合标记中的<value-type>属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值