Sto solo progettando la gestione delle eccezioni per l'interfaccia REST sul nostro server Spring.
Poiché avremo più controller REST, è necessaria una gestione centrale delle eccezioni. Spring offre la soluzione tramite @ControllerAdvice
. Funziona bene, tranne che devo aggiungere una dipendenza alla parte MVC di Spring, che non uso altrove (se qualcuno conosce una soluzione migliore senza questa dipendenza, sarei più che felice).
La mia idea è creare diverse eccezioni come NotFoundException
e BadRequestException
. Queste eccezioni possono essere utilizzate in un controller di riposo per provocare intenzionalmente una determinata risposta di errore con uno stato Http in base all'eccezione. Inoltre, qualsiasi eccezione non controllata che verrà catturata nel mio gestore di eccezioni @ControllerAdvice
, genererà anche un'eccezione di stato http personalizzata.
Mi sembra che in questo modo, posso combinare una gestione centrale delle eccezioni con un codice ben leggibile. Ci sono problemi o pensieri a riguardo?
Esempio di un controller REST
@RestController
@RequestMapping(ExampleRest.EXAMPLE_URI)
public class ExampleRest {
public static final String EXAMPLE_URI = "/examples";
@ Autowired
private ExampleService exampleService;
@ RequestMapping(value = "/{id}", method = GET)
public ExampleDto get( @ PathVariable long id) {
ExampleDto resultingExampleDto = exampleService.findById(id);
if (resultingExampleDto != null) {
return resultingExampleDto;
}
throw new NotFoundException(); //<- throwing the NotFound (404) exception
}
}
Gestore errori centrale
@EnableWebMvc
@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
//Exception handling
@ExceptionHandler(value = {ConstraintViolationException.class})
protected void handleConstraintViolation(ConstraintViolationException ex, WebRequest request) {
throw new BadRequestException(ex.getMessage());
}
//Exception handling
@ExceptionHandler(value = IllegalArgumentException.class)
protected void handleIllegalArgument(IllegalArgumentException ex, WebRequest request) {
throw new BadRequestException(ex.getMessage());
}
//actual request answer
@ExceptionHandler(value = BadRequestException.class)
protected ResponseEntity<Object> returnBadRequest(Exception ex, WebRequest request) {
return handleExceptionInternal(ex, ex.getMessage(), new HttpHeaders(), HttpStatus.BAD_REQUEST, request);
}
//actual request answer
@ExceptionHandler(value = NotFoundException.class)
protected ResponseEntity<Object> returnNotFound(Exception ex, WebRequest request) {
return handleExceptionInternal(ex, ex.getMessage(), new HttpHeaders(), HttpStatus.NO_CONTENT, request);
}
}