2011-12-06 86 views
5

它的我第一次在這裏發帖,請耐心指正在必要時...自定義異常處理 - Java Web服務

我建立中使用NetBeans的GlassFish的簡單的基於服務的Web應用程序。 NetBeans在爲新的Web服務及其操作生成代碼方面確實幫了很大忙,但有一件事讓我發瘋 - Web服務異常處理。操作,如:

@WebMethod(operationName = "checkUserExist") 
public String checkUserExist(@WebParam(name = "login") String login, @WebParam(name = "password") String password) throws LoginException { 

    String auth_code = ""; 
    bk_end.Validate val = new bk_end.Validate(); 

    boolean isValidated = val.check(login, password); 

    if(isValidated) 
    { 
     auth_code = val.return_AuthCode(); 
     bank_services.CustomerSerice.setAuth_Code(auth_code); 
     return auth_code; 
    } 

    throw new LoginException("Something is wrong!"); 

} 

和異常類:

public class LoginException extends Exception 
{ 
    String message; 


    public LoginException(String message) 
    { 
     super(); 
     this.message = message; 
    } 

    public String getErrorMessage() 
    { 
     return this.message; 
    } 
} 

拋出一個巨大的 異常詳細信息:java.lang.reflect.InvocationTargetException 加上噸其他異常的.. 我意識到這是一個非常非常不好的問題,但經過幾個小時嘗試各種事情,我只是不知道做什麼。 我已閱讀有關@WebFault的事情,但不知道如何正確指定此問題(附上我的例外以特定的方法..)

請幫忙,所有的想法都非常歡迎!

我得到的異常: 服務調用拋出一個異常消息:null;請參閱服務器日誌瞭解更多詳情

Exceptions details : java.lang.reflect.InvocationTargetException 
javax.servlet.ServletException: java.lang.reflect.InvocationTargetException 
    at org.glassfish.webservices.monitoring.WebServiceTesterServlet.doPost(WebServiceTesterServlet.java:330) 
    at org.glassfish.webservices.monitoring.WebServiceTesterServlet.invoke(WebServiceTesterServlet.java:106) 
    at org.glassfish.webservices.EjbWebServiceServlet.service(EjbWebServiceServlet.java:114) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
    at com.sun.grizzly.http.servlet.ServletAdapter$FilterChainImpl.doFilter(ServletAdapter.java:1002) 
    at com.sun.grizzly.http.servlet.ServletAdapter$FilterChainImpl.invokeFilterChain(ServletAdapter.java:942) 
    at com.sun.grizzly.http.servlet.ServletAdapter.doService(ServletAdapter.java:404) 
    ... 
Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.glassfish.webservices.monitoring.WebServiceTesterServlet.doPost(WebServiceTesterServlet.java:301) 
    ... 24 more 
Caused by: bank_services.LoginException_Exception: excepts.LoginException 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
    at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:145) 
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:123) 
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:93) 
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:144) 
    at $Proxy383.checkUserExist(Unknown Source) ... 29 more    
+0

你說過,當你拋出LoginException時,你會得到「數十個其他例外,但我想要的。」你能告訴我們什麼異常是拋出嗎? –

+0

是真的,更新我的問題與所需的細節! – Mike

+0

有人...?我已經整整一天了,必須有解決方案,它是一個初學者問題... – Mike

回答

4

噢好的。你想看到「有問題」的消息。

所以我認爲這裏最終的問題是,您沒有使用Throwable中的標準detailMessage字段。如果您只是將消息傳遞給基類(super(message);),那麼我敢打賭你會在跟蹤中看到異常。您是否嘗試過其他Exception類型,如Exception

你也可以定義LoginException.toString()是這樣的:

@Override 
public String toString() { 
    String s = getClass().getName(); 
    return (message != null) ? (s + ": " + message) : s; 
} 

或者,你需要做這樣的事情:

try { 
    ... 
} catch (Exception e) { 
    if (e instanceof ServletException) { 
     e = e.getCause(); 
    } 
    if (e instanceof InvocationTargetException) { 
     e = e.getCause(); 
    } 
    if (e instanceof LoginException) { 
     System.err.println("Login exception returned message: " 
      + ((LoginException)e). getErrorMessage()); 
    } else { 
     System.err.println("Exception returned message: " + e); 
    } 
} 

但我認爲我的建議是使用super(message);在你的構造函數。

+0

正如我已經提到的,我的web服務知識是非常基本的...我試圖實現的:我的客戶端應用程序發送兩個字符串,Web服務操作檢查它們,如果正確的罰款,如果不正確 - > LoginException被拋出。如果在服務器端引發(並且正常工作)消息(「某事是錯誤的」)將被顯示給嘗試登錄的用戶......這就是所有... – Mike

+0

客戶端代碼有一個最新的LoginException類的副本嗎?你應該在你的異常中添加一個'serialVersionUID'字段並用一個數字來更新它。如果您的客戶端沒有正確版本的LoginException,則會拋出異常。 – Gray

+0

「客戶有這個班嗎?」 - 不確定是否理解正確 - 我正在使用NetBeans生成與客戶端服務器相關的代碼... – Mike