2011-02-23 50 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

相关问题