2013-01-08 251 views
0

我正在開發一個簡單的Web服務和客戶端。見我服務的片段:返回null或拋出異常

@webService 
public Car carData(int id) { 
    try { 
    return carDAO.getCars(id); 
    } catch (NullPointerException e) { 
     System.out.println("Error: "+e.getLocalizedMessage()); 

    } 
    return null; 

}

是是確定返回null到客戶端,然後在客戶端應採取的空照顧還是更該Web服務照顧的空,拋出異常?

更新: 如何返回nullpointerexception而不是返回null?

你會推薦什麼?

感謝

+3

如果是網絡,爲什麼不返回一個有效的HTTP響應代碼與相應的錯誤消息? – David

+0

現在我只是在控制檯中測試:) –

+0

最好的辦法是給出一個有效的答案。如果有任何異常,最好拋出自己的服務異常(錯誤)並讓客戶端來處理它。更多信息:[SOAP故障或結果對象?](http://stackoverflow.com/q/2823100/1065197) –

回答

1

您可以在JAX-WS Web服務中使用SOAP錯誤。這樣,您可以在未找到先決條件時引發自定義異常。客戶對發生的事情有了更好的瞭解。

爲此,您需要一個例外@WebFault註釋。你可以在Using SOAP Faults and Exceptions in Java JAX-WS Web Services - Eben Hewitt on Java找到一個很好的例子。

Users Guide » GlassFish » Metro » JAX-WS你可以找到這個例子:

package fromjava.server; 

import javax.jws.WebService; 

@WebService 
public class AddNumbersImpl { 
    /** 
    * @param number1 
    * @param number2 
    * @return The sum 
    * @throws AddNumbersException if any of the numbers to be added is 
    * negative. 
    */ 
    public int addNumbers(int number1, int number2) throws 
      AddNumbersException { 
     if (number1 < 0 || number2 < 0) { 
      throw new AddNumbersException("Negative number cant be " + 
        "added!", "Numbers: " + number1 + ", " + number2); 
     } 
     return number1 + number2; 
    } 
} 

例外:

package fromjavahandler.server; 

public class AddNumbersException extends Exception { 

    String detail; 

    public AddNumbersException(String message, String detail) { 
     super(message); 
     this.detail = detail; 
    } 

    public String getDetail() { 
     return detail; 
    } 
} 

的JAX-WS運行時自動生成故障。

0

還有的可能會是這個一百萬個不同的意見,但我會告訴你我會怎麼做。

典型的遠程服務已經能夠在遠程調用是由隨後失敗拋IOException的,所以我想試着放過我的客戶永遠不必處理RuntimeException或任何其子類(包括NullPointerException)的可能性。如果您的服務拋出RuntimeException並且客戶端打印出堆棧跟蹤,那麼客戶端開發人員會感到困惑,因爲堆棧跟蹤與服務器上運行的代碼有關,開發人員可能很少或根本無法控制該代碼。理想情況下,客戶只需要處理返回null而不是預期響應的情況。如果null不足以告訴客戶端出現問題或者問題源自客戶端提供的輸入問題,則僅在服務器端拋出Exception

0

你不應該得到一個NPE。如果你這樣做,這可能意味着你的服務沒有被初始化,你應該拋出一個IllegalStateException或回覆一條消息給客戶端,說Web服務不可用