Axis2 原生支援陣列與自訂類別(介面)作為方法參數或回傳值。陣列僅限一維,多維陣列可透過分隔符(如逗號)在一維字串陣列中模擬。
import java.io.*;
import data.DataForm;
public class ComplexTypeService {
// 位元組陣列上傳圖片
public boolean uploadImageWithByte(byte[] imageByte, int length) {
try (FileOutputStream fos = new FileOutputStream("d:\\test1.jpg")) {
fos.write(imageByte, 0, length);
return true;
} catch (Exception e) {
return false;
}
}
// 回傳一維字串陣列
public String[] getArray() {
return new String[] { "自行車", "飛機", "火箭" };
}
// 模擬二維陣列:以逗號分隔
public String[] getMDArray() {
return new String[] {
"自行車,飛機,火箭",
"中國,美國,德國",
"超人,蜘蛛俠,鋼鐵俠"
};
}
// 回傳自訂物件
public DataForm getDataForm() {
return new DataForm();
}
// 物件序列化為 byte[]
public byte[] getDataFormBytes() throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(new DataForm());
return baos.toByteArray();
}
}
package data;
public class DataForm implements java.io.Serializable {
private String name = "bill";
private int age = 20;
// getter/setter 略
}
DataForm.class → WEB-INF/classes/dataComplexTypeService.class → WEB-INF/pojoRPCServiceClient client = new RPCServiceClient();
Options options = client.getOptions();
options.setTo(new EndpointReference("https://localhost:8080/axis2/services/ComplexTypeService"));
// 上傳圖片
File file = new File("f:\\images.jpg");
byte[] buffer = new byte[(int) file.length()];
new FileInputStream(file).read(buffer);
Object[] args = { buffer, buffer.length };
Class[] retTypes = { Boolean.class };
QName op = new QName("https://ws.apache.org/axis2", "uploadImageWithByte");
System.out.println(client.invokeBlocking(op, args, retTypes)[0]);
// 獲取一維陣列
op = new QName("https://ws.apache.org/axis2", "getArray");
String[] arr = (String[]) client.invokeBlocking(op, new Object[]{}, new Class[]{String[].class})[0];
// 解析模擬二維陣列
op = new QName("https://ws.apache.org/axis2", "getMDArray");
arr = (String[]) client.invokeBlocking(op, new Object[]{}, new Class[]{String[].class})[0];
for (String row : arr) {
for (String col : row.split(",")) System.out.print("<" + col + "> ");
System.out.println();
}
// 直接獲取物件
op = new QName("https://ws.apache.org/axis2", "getDataForm");
DataForm df = (DataForm) client.invokeBlocking(op, new Object[]{}, new Class[]{DataForm.class})[0];
// 反序列化物件
op = new QName("https://ws.apache.org/axis2", "getDataFormBytes");
buffer = (byte[]) client.invokeBlocking(op, new Object[]{}, new Class[]{byte[].class})[0];
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(buffer));
df = (DataForm) ois.readObject();
Split(',') 拆分字串後逐行加入。大檔案傳輸請改用 FTP/SFTP,Web Service 僅傳遞元資料;避免在 RPC 中傳輸巨大位元組陣列造成記憶體壓力。