Sto lavorando a un'app Jetty/RESTEasy. Se lancio uno WebApplicationException(myResponse)
da uno dei miei endpoint REST, invia la risposta data al client.Come si gestiscono gli stati di errore nei filtri del servlet senza mostrare all'utente una traccia dello stack?
Quando un filtro rileva un errore, voglio lo stesso comportamento:
- Deve interrompere l'esecuzione di procedere, e
- Dovrebbe dare all'utente una chiara, errore di formato JSON che non include una traccia dello stack.
Ovviamente, appena iscritto al flusso di risposta e return
ing opere all'interno del metodo doFilter
. Ma questo non funziona per altri metodi chiamati da doFilter
.
Lanciare qualsiasi eccezione soddisferà la condizione n. 1 ma non ho ancora trovato un modo corretto per soddisfare la condizione n. 2. (Puoi vedere il mio miglior tentativo in basso.)
Come la Percezione ha spiegato nella sua risposta, WebApplicationException
s sono trattati come qualsiasi altra eccezione nel contesto di un Filtro, e quindi forniscono all'utente una bella traccia di stack orribile.
Quindi, per riassumere le mie domande:
- fare contenitori serveltt hanno alcun equivalente a
throw new WebApplicationException(Response)
? - E forse ancora più importante, come gestiscono altri progetti Java?
Ho questo codice in un filtro e funziona, ma io preferirei una soluzione più elegante che si applica automaticamente a tutti i filtri:
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
try {
doFilterOrThrow(request, response, chain);
} catch (WebApplicationException e) {
Response res = e.getResponse();
((HttpServletResponse) response).sendError(res.getStatus(), (String) res.getEntity());
}
}
Grazie per le informazioni, penso di aver capito il problema un po 'meglio ora. Tuttavia, per chiarire: sto cercando un modo per scrivere entrambi nel flusso di risposta e * interrompere tutte le successive esecuzioni *. L'app su cui sto lavorando ha più filtri e alcuni di essi dipendono dai dati del precedente. Potrei semplicemente 'return' dal metodo' doFilter() ', ma questo non funziona se lo stato di errore viene rilevato in qualche altro metodo che chiama' doFilter() '. (Almeno non senza logica aggiuntiva ...) –
Se è necessario interrompere immediatamente l'elaborazione, in pratica è necessario replicare, nel filtro, i dati che *** *** sarebbero stati restituiti da JAX-RS. Semplicemente non c'è altro modo, poiché i filtri non vengono eseguiti nel contenitore JAX-RS (ma piuttosto prima di esso). Un'altra opzione sarebbe quella di implementare la logica del filtro nell'intercettore di pre process, anche se ho la sensazione che ci siano filtri e processi intermedi che si sta tentando di saltare prima di quel punto. – Perception
C'è un modo per impostare un gestore di errori generico per qualsiasi errore che si verifica nel contenitore del servlet, incluso nei filtri? - In realtà, penso che questo potrebbe essere ciò di cui ho bisogno: http://stackoverflow.com/questions/4207586/error-handler-servlet-how-to-get-exception-cause –