SOAP请求。将字符串转换为字节数组

时间:2012-04-23 13:11:09

标签: java soap jax-ws

我在Java上有Soap WS 这是肥皂要求

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:his="SCC/Lis/HistoryFormatter">
   <soapenv:Header/>
   <soapenv:Body>
      <his:formatHistoryByteArray>
         <arg0>cid:anystring</arg0>
      </his:formatHistoryByteArray>
   </soapenv:Body>
</soapenv:Envelope>  

FormatHistoryByteArray.class只有一个字段

@XmlElement(name = "arg0", namespace = "", nillable = true)
private byte[] arg0;  

输入* .xsd

  <xs:complexType name="formatHistoryByteArray">
    <xs:sequence>
      <xs:element name="arg0" type="xs:base64Binary" nillable="true" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

WSDL和xsd由JaxWS生成 我无法理解java-code中对byte []的请求中 节点中转换字符串的逻辑。帮助PLZ
cid:是否是需要的前缀?

编辑: 例如,如果我有请求

<arg0>abcdef</arg0>  

在java代码中我得到byte [] = {105,-73,29}

WebService如何从字符串 abcdef 获取此字节数组?

2 个答案:

答案 0 :(得分:4)

String.getBytes()返回给定String的(ASCII,UTF8,ISO-8859-1等)编码。这与Base 64不同。 Base 64是一种将任意字节显示为可打印字符的方法。因此没有理由让它们相同。

在Base 64和XML上查看本教程的2.1节:http://www.xml.com/pub/a/2003/02/26/binaryxml.html。 base64位看起来像这样:

<m:data xmlns:m='http://example.org/people' >
  <photo>/aWKKapGGyQ=</photo>
  <sound>sdcfo2JTiXE=</sound>
  <hash>Faa7vROi2VQ=</hash>
</m:data>

其中photo等是base64元素。不需要cid前缀。

为了解决您的问题,Web服务unmarshaller将abcdef解释为base-64编码的字符串,作为您收到的三个字节。

答案 1 :(得分:0)

架构专门将类型声明为:“xs:base64Binary”aka:BINARY。如果您希望信息本质上是文本的,那么类型应该是“xs:string”或类似的。

实际上,服务应该完全拒绝“cid:anystring”的值。这不是base64编码元素的有效值。

相关问题