Posso usar o ExceptionHandler do Java Springboot para rodar uma requisição novamente?

Eu só vi a classe ExceptionHandler sendo usada para retornar exceções imediatamente. Eu sei que esse é o propósito de uma classe para lidar com exceções, mas isso me leva à minha pergunta: se uma solicitação falhar na validação, é possível que a classe ExceptionHandler “corrija” o corpo da solicitação e execute novamente a solicitação?

Por exemplo:

public class Pessoa {
    @Pattern(regexp = "[A-Za-z]")
    private String nome;
}

Poderia uma handler ser modificada disso:

@ExceptionHandler(ParameterNotValidException.class)
public Map<String, String> handleValidationExceptions(
  ParameterNotValidException ex) {
    Map<String, String> errors = new HashMap<>();
    ex.getBindingResult().getAllErrors().forEach((error) -> {
        String fieldName = ((FieldError) error).getField();
        String errorMessage = error.getDefaultMessage();
        errors.put(fieldName, errorMessage);
    });
    return errors;
}

Para isso:

@ExceptionHandler(ParameterNotValidException.class)
public void handleValidationExceptions(String requestBody) {
    requestBody = removeSpecialCharacters(requestBody);

    try {
        pessoaController.putPessoa(requestBody);
    } catch (Exception e) {
        // reenviar a requisição corretamente
    }
}

Esse tipo de requisição que você quer fazer não é possível. ExceptionHandler é uma classe que usamos para poder gerenciar e tratar exceções e enviar o respectivo código de erro para a resposta da API. Veja mais na documentação em inglês.

ExceptionHandler servem para:

  • Lidar com exceções sem a anotação @ResponseStatus (tipicamente exceções predefinidas que você não escreveu);
  • Redirecionar usuário para uma view específica de erro;
  • Construir uma resposta a erro customizada.

No seu caso, os caracteres especiais devem ser tratados no estágio de json serialisation\deserialisation.