2011-12-06 22 views
5

Es mi primera vez publicar aquí así que por favor sea paciente y corregirme cuando sea necesario ...excepciones personalizadas de manipulación - Java Web Services

Estoy construyendo aplicación basada en servicios web simple usando NetBeans con GlassFish. NetBeans ayuda mucho en términos de generar código para nuevos servicios web y sus operaciones, aunque una cosa me enloquece: el manejo de excepciones del servicio web. Operación como:

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

} 

y la clase de excepción:

public class LoginException extends Exception 
{ 
    String message; 


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

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

lanza una masiva Excepciones detalles: java.lang.reflect.InvocationTargetException toneladas, además de otras excepciones .. Me di cuenta que es una Mucho menos preguntas, pero después de muchas horas de probar varias cosas, simplemente no sé qué hacer. He leído algo sobre @WebFault pero no tengo idea de cómo especificar esto correctamente (adjuntar mi excepción a un método particular ...)

Por favor, ayuda, todas las ideas son más que bienvenidas!

Excepciones que recibo: La invocación del servicio arrojó una excepción con el mensaje: null; Consulte el registro del servidor para obtener más información

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

Dijiste que cuando lanzas LoginException, obtienes "decenas de otras excepciones, excepto la que yo quiero". ¿Podría mostrarnos qué excepciones se lanzan en su lugar? –

+0

cierto que, actualizó mi pregunta con los detalles requeridos! – Mike

+0

alguien ...? Ya estoy todo el día, debe haber una solución, es un problema para principiantes ... – Mike

Respuesta

4

Oh ok. Desea ver el mensaje "Algo está mal".

Así que creo que el problema final aquí es que no está utilizando el campo estándar detailMessage en el Throwable. Si acaba de pasar el mensaje a la clase base (super(message);) entonces apuesto a que verá la excepción en el rastreo. ¿Probaste con otro tipo de Exception como Exception?

También podría definir el LoginException.toString() a ser algo así como:

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

Alternativamente, usted tendrá que hacer algo como esto:

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

pero creo que mi recomendación es usar super(message); en tu constructor

+0

Como ya mencioné, el conocimiento de mi servicio web es muy básico ... Lo que estoy tratando de lograr: mi aplicación cliente envía dos cadenas, la operación del servicio web las revisa, si es correcta, si es incorrecta -> LoginException es lanzada. Si se lanza en el lado del servidor (y funcionó correctamente), el mensaje ("Algo está mal") se mostraría al usuario que intenta iniciar sesión ... eso es todo ... – Mike

+0

¿Y el código del cliente tiene una copia de la clase 'LoginException' que está actualizada? Debe agregar un campo 'serialVersionUID' a su excepción y actualizarlo con un número. Su cliente lanzará una excepción, entonces, si no tiene la versión correcta de 'LoginException'. – Gray

+0

"¿Tiene el cliente esta clase?" - No estoy seguro si entiendo correctamente - Estoy usando NetBeans para generar código relacionado con el cliente-servidor ... – Mike