2012-11-28 19 views
5

sto alle prese con la Spark Framework e sto cercando di capire il modo migliore per la gestione delle eccezioni in modo uniforme per percorsi multipli.Come gestire le eccezioni per Route multipla

Al momento ho un certo numero di rotte che tutti gestire le eccezioni lungo le linee di:

... 
catch (final Exception e) { 
    ... 
    response.status(418); 
    return e.getMessage(); 
} 
... 

Questo lascia molto a desiderare, soprattutto la logica di eccezione viene duplicata tra di loro. So che può essere migliorata con refactoring, ma mi chiedevo se c'è qualcosa di simile alla ExceptionHandler meccanismo nella primavera in cui è possibile eseguire un'azione quando viene generata una particolare eccezione, ad esempio:

@ExceptionHandler(Exception.class) 
public void handleException(final Exception e, final HttpServletRequest request) { 
    ...executed for the matching exception... 
} 

è così, c'è una Meccanismo scintillante per la gestione delle eccezioni? Ho controllato la documentazione e sono venuto a mancare. Se non c'è, andrò avanti con i miei piani di refactoring. Grazie.

+0

@ david99world La descrizione del tag [spark] non ha nulla a che fare con questo nuovo schema spark. Il tag deve essere ridefinito o deve essere creato un nuovo tag per questo. –

+0

@ david99world Ho provato ad aggiungere un tag 'spark-framework' ma non ho abbastanza rep, penso che sia necessario 1.5k. – Jonathan

risposta

7

È possibile gestire le eccezioni in questo modo:

get("/throwexception", (request, response) -> { 
    throw new NotFoundException(); 
}); 

exception(NotFoundException.class, (e, request, response) -> { 
    response.status(404); 
    response.body("Resource not found"); 
}); 

esempio tratto dal Spark docs.

0

Ho avuto a che fare con questo stesso problema. Questo è quello che mi è venuto in mente. Avrà bisogno di modificare il tuo ambiente.

public class ExceptionHandler extends MustacheTemplateHandler 
{ 
private final WrappedHandler inter; 

public abstract static class WrappedHandler 
{ 
    public abstract Object handle(Request req, Response res);  
} 

public static ExceptionHandler wrap(String path, WrappedHandler internal) 
{ 
    return new ExceptionHandler(path, internal); 
} 

private ExceptionHandler(String path, WrappedHandler internal) 
{ 
    super(path); 
    inter = internal; 
} 

@Override 
public Object handle(Request req, Response res) 
{ 
    try 
    { 
     return inter.handle(req, res); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
     return new ModelAndView(e, "errors"); 
    } 
} 
} 

e poi (utilizzando l'importazione statica):

get(wrap("/download", new DownloadHandler())); 
    post(wrap("/upload", new UploadHandler())); 
+0

Ciao @Dan Sono desideroso di sapere quali altri tweaking nel tuo ambiente ti servissero per farlo funzionare come ho riscontrato lo stesso problema. –

Problemi correlati