2011-12-06 13 views
5

La mia prima volta distacco qui quindi per favore siate pazienti e mi correggere quando necessario ...eccezioni personalizzate movimentazione - Java Web Services

sto costruendo semplice applicazione basata su web service utilizzando NetBeans con GlassFish. NetBeans aiuta molto in termini di generazione di codice per i nuovi servizi Web e le loro operazioni, ma una cosa mi fa impazzire: la gestione delle eccezioni dei servizi Web. Funzionamento come:

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

} 

e la classe di eccezione:

public class LoginException extends Exception 
{ 
    String message; 


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

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

lancia una massiccia Eccezioni dettagli: java.lang.reflect.InvocationTargetException più tonnellate di altre eccezioni .. Mi rendo conto che è un una domanda molto nodosa, ma dopo molte ore di provare varie cose, non so proprio cosa fare. Ho letto della cosa @WebFault ma non ho idea di come specificarlo correttamente (collega la mia eccezione a un metodo particolare ..)

Si prega di aiuto, tutte le idee sono più che benvenute!

Eccezioni ricevute: L'invocazione del servizio ha generato un'eccezione con il messaggio: null; Fare riferimento al registro del server per ulteriori dettagli

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

Hai detto che quando lanci LoginException, ottieni "decine di altre eccezioni tranne quella che voglio". Potresti per favore mostrarci quali eccezioni vengono invece lanciate? –

+0

vero che, aggiornato la mia domanda con i dettagli richiesti! – Mike

+0

qualcuno ...? Sono già tutto il giorno, ci deve essere una soluzione, è un problema per i principianti ... – Mike

risposta

4

Oh ok. Vuoi vedere il messaggio "Qualcosa è sbagliato".

Quindi penso che il problema principale qui è che non si sta utilizzando il campo standard detailMessage nello Throwable. Se si passa il messaggio alla classe base (super(message);), allora scommetto che si vedrà l'eccezione nella traccia. Hai provato un altro tipo Exception come ad esempio Exception?

Si potrebbe anche definire la LoginException.toString() essere qualcosa di simile:

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

In alternativa, è necessario fare qualcosa di simile:

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

Ma penso che la mia raccomandazione è di usare super(message); in il tuo costruttore.

+0

Come ho già detto, la mia conoscenza del servizio web è molto semplice ... Quello che sto cercando di ottenere: la mia app cliente invia due stringhe, le operazioni di servizio web le controllano, se corrette correttamente, se non corrette -> LoginException viene lanciata. Se lanciato sul server (e ha funzionato correttamente) messaggio ("Qualcosa è sbagliato") verrebbe visualizzato all'utente che tenta di accedere ... questo è tutto ... – Mike

+0

E il codice cliente ha una copia della classe 'LoginException' che è aggiornata? Dovresti aggiungere un campo 'serialVersionUID' alla tua eccezione e aggiornarlo con un numero. Il tuo cliente genererà un'eccezione se non ha la versione corretta di 'LoginException'. – Gray

+0

"Il client ha questa classe?" - Non sono sicuro se capisco correttamente - sto usando NetBeans per generare codice correlato client-server ... – Mike