閱讀992 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《Spring攻略(第2版)》——1.6 為集合元素指定數據類型

本節書摘來自異步社區《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 
   >
   <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 
   >
   ...
   <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 
   >
   ...
   <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 
   >
   ...
   <property name="suffixes">
     <list>
        <value>5</value>
        <value>10</value>
        <value>20</value>
     </list>
   </property>
</bean>

最後更新:2017-05-31 15:31:26

  上一篇:go  《Spring攻略(第2版)》——1.7 使用Spring的FactoryBean創建Bean
  下一篇:go  《Spring攻略(第2版)》——1.5 指定Bean引用