首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java WebService 客戶端調用對象數組參數錯誤解決方案

     編輯:程式設計綜合問答

問題背景

在開發 Java WebService 時,服務端方法需要接收一個對象數組參數,例如:

public String getAge(Student[] ss) {
    return ss[0].getAge();
}

但在客戶端調用時,服務端接收到的數組長度始終為 1,且對象屬性全為 null。這是一個典型的 Axis 客戶端調用參數封裝錯誤。

錯誤代碼分析

原始客戶端代碼中,調用 call.invoke(new Object[] {ss}) 將數組包裝在另一個數組中,導致服務端解析出錯。同時缺少參數註冊與類型映射的完整配置。

正確解決方案

核心修正點:

  1. call.invoke 參數直接傳遞對象數組,無需額外包裝。
  2. 使用 call.addParameter 為每個數組元素註冊參數類型。
  3. 確保類型映射正確註冊 BeanSerializerFactory 與 BeanDeserializerFactory。

修正後的完整代碼

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} 雙重包裝。這是一個容易被忽視的低級錯誤,也是「小黃鴨調試法」的經典案例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved