Spring Boot @ControllerAdvice / @Valid - PullRequest
       47

Spring Boot @ControllerAdvice / @Valid

0 голосов
/ 21 февраля 2020

Я работаю над примером демонстрационного приложения для обработки исключений в Spring Boot. Я пытаюсь обработать исключения с помощью @ ControllerAdvice.

Я хотел бы обработать исключение, выданное валидатором. Он обрабатывает другие исключения, но не MethodArgumentNotValidException.

Для более подробной информации ниже приведены классы, над которыми я работаю:

Query. java

@Getter
@Setter
@NoArgsConstructor
@Validated
public class Query implements Serializable{
    @Size(min = 7, max = 24, message = "Size must be between 7 and 24")
    @Pattern(regexp = "[a-zA-Z0-9 ]+", Invalid characters")
    private String number;

    @Size(max = 2, message = "Size must be between 0 and 2")
    @Pattern(regexp = "[a-zA-Z0-9 ]+", message="Invalid characters")
    private String language;
}

ErrorResponse. java

@Setter
@Getter
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
@Data
public class ErrorResponse 
{

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd hh:mm:ss")
    private LocalDateTime timestamp;

    private HttpStatus status;

    private int code;

    private String error;

    private String exception;

    private String message;

    private String path;

    private List<String> errors;

}

CustomExceptionHandler. java

@SuppressWarnings({"unchecked","rawtypes"})
@ControllerAdvice
@Component("error")
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {

    @ResponseStatus(HttpStatus.NOT_FOUND)
    @ExceptionHandler(NotFoundException.class)
    public final ResponseEntity<Object> handleNotFoundError(NotFoundException ex, final HttpServletRequest request) {
        ErrorResponse error = new ErrorResponse();
        error.setTimestamp(LocalDateTime.now());
        error.setMessage(ex.getMessage());
        error.setCode(HttpStatus.NOT_FOUND.value());
        return new ResponseEntity(error, HttpStatus.NOT_FOUND);
    }

    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler(InternalServerException.class)
    public final ResponseEntity<Object> handleInternelServorError(InternalServerException ex, final HttpServletRequest request) {
        ErrorResponse error = new ErrorResponse();
        error.setTimestamp(LocalDateTime.now());
        error.setMessage(ex.getMessage());
        error.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
        return new ResponseEntity(error, HttpStatus.INTERNAL_SERVER_ERROR);
    }

    @ExceptionHandler(ConstraintViolationException.class)
    public void constraintViolationException(HttpServletResponse response) throws IOException {
        response.sendError(HttpStatus.BAD_REQUEST.value());
    }

    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        List<String> errorList = ex
                .getBindingResult()
                .getFieldErrors()
                .stream()
                .map(fieldError -> fieldError.getDefaultMessage())
                .collect(Collectors.toList());
        ErrorResponse error = new ErrorResponse();
        error.setCode(HttpStatus.BAD_REQUEST.value());
        return new ResponseEntity(error, HttpStatus.BAD_REQUEST);
    }
}

Запрос

public ResponseEntity<?> getData(HttpServletRequest httpServletRequest,
            @Valid @ApiParam(value = "MANDATORY. The number") @PathVariable(value = "number", required = true) final String partNumber,
            @Valid @ApiParam(value = "OPTIONAL. The language") @RequestParam(value = "language", required = false) final String languageKey) {
.............
}
...