简体   繁体   中英

How to handle Internal server error (500) on spring rest API?

Good day,

I am working on spring rest api and i would like to sure everything is working fine. I would like to log abnormal behaviors like nullPointerException or database connection error or any Exception that could raise and not handled or not assumed.

I would like to catch any unhandled exception and show a beautifull message to user instead of printing stack trace.

for this i found a solution on internet that is extend ResponseEntityExceptionHandler and override handleExceptionInternal method.

I also like to log 404 errors to see if someone trying to attack on my server.

I have also added this line in properties file : spring.mvc.throw-exception-if-no-handler-found=true

and here is the code for 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);

}

My problem is when i am passing incorrect route like /abc this code is running fine, But when i throw null pointer exception from controllers method this method is not catching it.

thanks.

@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 - here you can find all objects the method signature can operate with.

ControllerAdvice - with no additional properties it will handle all exceptions, so it can provide unexpected behavior. It's better to provide a package (your package) to basePackages property and it will handle only exceptions thrown in specified package.

Also it is a good practice to separate Exceptions to custom @ExceptionHandler marked methods, it will decouple the handlers logic.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM