2011-02-23 81 views
2

將byte數組注入到數組列表中的正確方法是什麼?Spring:在ArrayList中注入字節數組

private ArrayList<byte[]> bytes; 

<property name="bytes"> 
<list> 
    <value>0x03,0x4d</value> 
</list> 
</property> 

不起作用,因爲每個字符(0,x,0,3)都被轉換爲單個字節。 我也嘗試編碼像&#03 ;,但這也不起作用。

一種解決方法將轉換爲整數第一個然後手動轉換回在bean中的字節,但這並不太漂亮。

有什麼想法?

問候

回答

2

有一個內置的ByteArrayPropertyEditor,但根據的Javadoc,它只將字符串轉換成相應的字節數組:

byte數組編輯器。字符串將被簡單地轉換爲相應的字節表示。

也許你應該write your own屬性編輯器將byte[]的任意表示轉換爲列表?

+0

「它只是將字符串轉換成相應的字節數組」 那這個問題,因爲我不知道如何爲字符串類型STX(0x03h);) – foster 2011-02-23 09:02:38

+0

你不能因爲你有UTF-8編碼XML文件雖然它適用於具有國家字符的字符串(例如中文),但不能使用任意字節。這就是爲什麼我建議你編寫自定義屬性編輯器,例如,讀取Base64編碼的字符串並將它們轉換爲字節。 – 2011-02-23 09:10:51

2

這裏是一個FactoryBean創建您的字節數組:

public class ByteArrayFactoryBean extends AbstractFactoryBean<byte[]>{ 

    @Override 
    public Class<?> getObjectType(){ 
     return byte[].class; 
    } 

    private String data; 

    @Required 
    public void setData(final String data){ 
     this.data = data; 
    } 

    @Override 
    protected byte[] createInstance() throws Exception{ 
     final String[] tokens = data.split("\\s*,\\s*"); 
     final byte[] output = new byte[tokens.length]; 
     for(int i = 0; i < tokens.length; i++){ 
      output[i] = Byte.decode(tokens[i]).byteValue(); 
     } 
     return output; 
    } 

} 

用法:

<bean class="foo.bar.SomeBean"> 
    <property name="bytes"> 
     <list> 
      <bean class="foo.bar.ByteArrayFactoryBean"> 
       <property name="data" value="0x03,0x4d" /> 
      </bean> 
     </list> 
    </property> 
</bean> 

(註冊一個PropertyEditor會比較正確的,但也更多的工作)


但是如果我理解你的評論對,你的實際問題是你不知道如何寫一個字符串與奇特的字節?您可以使用Unicode escapes

System.out.println("H\u00e4\u00e4\u00e4\u00e4\u00e4hhh???"); 

輸出:

Hääääähhh???

你當然也可以在Spring XML文件中使用這個語法。

+0

使用 \將導致包含[92,117,48,48,48,51]而不是0x03h的字節數組。 92是「\」的值,117是「u」等的值 – foster 2011-02-23 09:58:01