在開發 Java WebService 時,服務端方法需要接收一個對象數組參數,例如:
public String getAge(Student[] ss) {
return ss[0].getAge();
}
但在客戶端調用時,服務端接收到的數組長度始終為 1,且對象屬性全為 null。這是一個典型的 Axis 客戶端調用參數封裝錯誤。
原始客戶端代碼中,調用 call.invoke(new Object[] {ss}) 將數組包裝在另一個數組中,導致服務端解析出錯。同時缺少參數註冊與類型映射的完整配置。
核心修正點:
call.invoke 參數直接傳遞對象數組,無需額外包裝。call.addParameter 為每個數組元素註冊參數類型。public static void main(String[] args) throws ServiceException, MalformedURLException, RemoteException {
Logger log = Logger.getLogger(Client.class);
String nameSpace = "https://impl.webservice";
String method = "getAge";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL("https://localhost:8070/TEST/services/testMyService?wsdl"));
call.setUseSOAPAction(true);
Object[] ss = new Student[2];
Student s0 = new Student();
s0.setAge("123");
s0.setName("57");
ss[0] = s0;
Student s1 = new Student();
s1.setAge("123");
s1.setName("213");
ss[1] = s1;
QName qn = new QName(nameSpace, method);
call.setOperationName(qn);
call.registerTypeMapping(Student.class, qn,
new org.apache.axis.encoding.ser.BeanSerializerFactory(Student.class, qn),
new org.apache.axis.encoding.ser.BeanDeserializerFactory(Student.class, qn));
for (int i = 0; i < ss.length; i++) {
call.addParameter(qn, XMLType.SOAP_ARRAY, ParameterMode.IN);
}
String ret = (String) call.invoke(ss);
log.info(ret);
System.out.println(ret);
}
call.invoke 本身接受的是參數數組,傳入 Student[] 即可,切勿再用 new Object[]{ss} 雙重包裝。這是一個容易被忽視的低級錯誤,也是「小黃鴨調試法」的經典案例。