web-dev-qa-db-fra.com

Comment gérer l'erreur de serveur interne (500) sur l'API Spring Rest?

Bonne journée,

Je travaille sur l'api de repos de ressort et je voudrais m'assurer que tout fonctionne bien. Je voudrais enregistrer des comportements anormaux comme nullPointerException ou une erreur de connexion à la base de données ou toute exception qui pourrait être déclenchée et non gérée ou non supposée.

Je voudrais intercepter toute exception non gérée et afficher un beau message à l'utilisateur au lieu d'imprimer la trace de la pile.

pour cela, j'ai trouvé une solution sur Internet qui étend la méthode ResponseEntityExceptionHandler et remplace la méthode handleExceptionInternal.

J'aime également enregistrer les erreurs 404 pour voir si quelqu'un essaie d'attaquer sur mon serveur.

J'ai également ajouté cette ligne dans le fichier de propriétés: spring.mvc.throw-exception-if-no-handler-found = true

et voici le code de handleExceptionInternal

@Override
protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {

    GenericResponse response = new GenericResponse();
    response.setMessage("Internal error occured, " + ex.getStackTrace()[0]);

    System.out.println("big exceptions");

    return new ResponseEntity(response, headers, status);

}

Mon problème est que lorsque je passe une route incorrecte comme/abc, ce code fonctionne correctement, mais lorsque je jette une exception de pointeur nul à partir de la méthode des contrôleurs, cette méthode ne l'attrape pas.

merci.

10
user3454581
@ControllerAdvice
public class Handler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<Object> handle(Exception ex, 
                HttpServletRequest request, HttpServletResponse response) {
        if (ex instanceof NullPointerException) {
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
    }
}

ExceptionHandler Documenation - ici vous pouvez trouver tous les objets avec lesquels la signature de méthode peut fonctionner.

ControllerAdvice - sans propriétés supplémentaires, il gérera toutes les exceptions, il peut donc fournir un comportement inattendu. Il est préférable de fournir un package (votre package) à la propriété basePackages et il ne traitera que les exceptions levées dans le package spécifié.

Il est également recommandé de séparer les exceptions des méthodes marquées @ExceptionHandler Personnalisées, cela découplera la logique des gestionnaires.

8
Bogdan Oros