2011-12-06 29 views
5

Đây là lần đầu tiên tôi đăng bài ở đây vì vậy hãy kiên nhẫn và sửa tôi bất cứ khi nào cần thiết ...Xử lý ngoại lệ tùy chỉnh - java Web Services

Tôi đang xây dựng ứng dụng dựa trên dịch vụ web đơn giản sử dụng NetBeans với GlassFish. NetBeans giúp ích rất nhiều trong việc tạo mã cho các dịch vụ web mới và các hoạt động của họ, một điều khiến tôi phát điên - xử lý ngoại lệ dịch vụ web. Hoạt động như:

@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!"); 

} 

và lớp ngoại lệ:

public class LoginException extends Exception 
{ 
    String message; 


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

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

ném một đồ sộ Exceptions chi tiết: java.lang.reflect.InvocationTargetException tấn cộng với trường hợp ngoại lệ khác .. Tôi nhận ra đó là một rất nhiều câu hỏi nooby, nhưng sau nhiều giờ cố gắng những điều khác nhau tôi chỉ không biết những gì tot làm. Tôi đã đọc về điều @WebFault nhưng không biết làm thế nào để xác định chính xác điều này (đính kèm ngoại lệ của tôi vào một phương thức cụ thể ..)

Xin vui lòng trợ giúp, tất cả ý tưởng đều được hoan nghênh!

Trường hợp ngoại lệ tôi nhận được: Yêu cầu dịch vụ đã ném một ngoại lệ với thông báo: null; Tham khảo nhật ký máy chủ để biết thêm chi tiết

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

Bạn nói rằng khi bạn ném LoginException, bạn sẽ nhận được "hàng chục trường hợp ngoại lệ khác nhưng tôi muốn." Bạn có thể vui lòng cho chúng tôi biết những ngoại lệ nào sẽ bị ném vào thay thế không? –

+0

đúng, cập nhật câu hỏi của tôi với các chi tiết cần thiết! – Mike

+0

ai ...? Tôi đã ở đó cả ngày rồi, phải có giải pháp, vấn đề của người mới bắt đầu ... – Mike

Trả lời

4

Oh ok. Bạn muốn xem thông báo "Đã xảy ra lỗi".

Vì vậy, tôi nghĩ vấn đề cuối cùng ở đây là bạn không sử dụng trường tiêu chuẩn detailMessage trong Throwable. Nếu bạn chỉ cần chuyển tin nhắn đến lớp cơ sở (super(message);) thì tôi đặt cược bạn sẽ thấy ngoại lệ trong dấu vết. Bạn đã thử một loại khác Exception chẳng hạn như chỉ Exception?

Bạn cũng có thể xác định LoginException.toString() là một cái gì đó như:

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

Ngoài ra, bạn sẽ cần phải làm một cái gì đó như thế này:

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); 
    } 
} 

Nhưng tôi nghĩ rằng đề nghị của tôi là sử dụng super(message); trong nhà xây dựng của bạn.

+0

Như tôi đã đề cập, kiến ​​thức dịch vụ web của tôi rất cơ bản ... Những gì tôi đang cố gắng đạt được: ứng dụng khách của tôi gửi hai chuỗi, hoạt động dịch vụ web kiểm tra chúng, nếu đúng, nếu không chính xác -> LoginException được ném. Nếu được ném vào phía máy chủ (và làm việc đúng) tin nhắn ("Cái gì đó là sai") sẽ được hiển thị cho người dùng cố gắng đăng nhập ... đó là tất cả ... – Mike

+0

Và mã máy khách có một bản sao của lớp 'LoginException' được cập nhật? Bạn nên thêm một trường 'serialVersionUID' vào ngoại lệ của bạn và cập nhật nó với một số. Khách hàng của bạn sẽ ném một ngoại lệ sau đó nếu nó không có phiên bản đúng của 'LoginException'. – Gray

+0

"Khách hàng có lớp học này không?" - không chắc chắn nếu hiểu chính xác - Tôi đang sử dụng NetBeans để tạo mã liên quan đến máy khách-máy chủ ... – Mike