Spring ExceptionHandler 可以用于重新 运行 端点吗?

Can the Spring ExceptionHandler be used to re-run endpoints?

根据我的经验,尽管可能有限,我只见过 ExceptionHandler class 用于立即 return 异常。我知道这是 ExceptionHandler class 的目的,但这让我想到了我的问题:如果请求验证失败,ExceptionHandler class 是否有可能要“修复”请求正文并重新运行 请求?

例如,给定以下对象:

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

可以使用以下处理程序 class:

@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;
}

修改成这样:

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

    try {
        personController.putPerson(requestBody);
    } catch (Exception e) {
        //fail gracefully
    }
}

提前致歉,这是我在 Whosebug 上的第一个问题。

这是不可接受的。 ExceptionHandler 是一个常见的地方,我们可以在其中管理和处理异常并为 API 响应发送相应的错误代码。
参见documentation
它专为:

  • Handle exceptions without the @ResponseStatus annotation (typically predefined exceptions that you didn’t write)
  • Redirect the user to a dedicated error view
  • Build a totally custom error response


在您的情况下,特殊字符应在 json serialisation\deserialisation 阶段处理。 Escape JSON string in Java