UsersErrorController.java

package es.um.atica.faker.users.adapters.rest;

import java.util.NoSuchElementException;
import javax.servlet.http.HttpServletRequest;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.access.AuthorizationServiceException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import es.um.atica.faker.users.adapters.rest.dto.ErrorDTO;

@ControllerAdvice
public class UsersErrorController {

    private ResponseEntity<ErrorDTO> buildErrorResponse(HttpStatus status, Exception ex, HttpServletRequest req) {
        return ResponseEntity
            .status(status)
            .body(ErrorDTO.builder()
                    .status(status.value())
                    .timestamp(System.currentTimeMillis())
                    .error(ex.getMessage())
                    .exception(ex.getClass().getName())
                    .path(req.getRequestURI())
                    .method(req.getMethod())
                    .principal(req.getUserPrincipal().getName())
                    .build());
    }

    @ExceptionHandler(NoSuchElementException.class)
    public ResponseEntity<ErrorDTO> handleNoSuchElement(Exception ex, HttpServletRequest req) {
        return buildErrorResponse(HttpStatus.NOT_FOUND, ex, req);
    }

    @ExceptionHandler(UnsupportedOperationException.class)
    public ResponseEntity<ErrorDTO> handleUnsupportedException(Exception ex, HttpServletRequest req) {
        return buildErrorResponse(HttpStatus.CONFLICT, ex, req);
    }

    @ExceptionHandler(IllegalArgumentException.class)
    public ResponseEntity<ErrorDTO> handleIllegalArgumentException(Exception ex, HttpServletRequest req) {
        return buildErrorResponse(HttpStatus.BAD_REQUEST, ex, req);
    }

    @ExceptionHandler(AuthorizationServiceException.class)
    public ResponseEntity<ErrorDTO> handleAuthorizationServiceException(Exception ex, HttpServletRequest req) {
        return buildErrorResponse(HttpStatus.UNAUTHORIZED, ex, req);
    }

    @ExceptionHandler(AccessDeniedException.class)
    public ResponseEntity<ErrorDTO> handleAccessDeniedException(Exception ex, HttpServletRequest req) {
        return buildErrorResponse(HttpStatus.FORBIDDEN, ex, req);
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorDTO> handleGeneralException(Exception ex, HttpServletRequest req) {
        //ex.printStackTrace(System.err);
        return buildErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR, ex, req);
    }

}