1. 程式人生 > >Spring入門學習——為集合元素指定資料型別

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-00202017033110001-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>屬性。