2011-12-06 58 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