Java 如何在SpringWebFlux中处理/捕获特定于框架的异常

Java 如何在SpringWebFlux中处理/捕获特定于框架的异常,java,validation,jackson,spring-webflux,Java,Validation,Jackson,Spring Webflux,我有一个SpringWebFlux应用程序,我使用@JsonTypeInfo注释来处理多态类型。 同时,我对负责多态类型的同一个键使用了ConstraintValidator 以下是一些例子: @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "type", visible = true) @JsonSubTypes({ @

我有一个SpringWebFlux应用程序,我使用
@JsonTypeInfo
注释来处理多态类型。 同时,我对负责多态类型的同一个键使用了
ConstraintValidator

以下是一些例子:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "type", visible = true)
@JsonSubTypes({
    @JsonSubTypes.Type(value = Child.class, name = "CUSTOM_TYPE")
})
abstract class Parent<T> {

  @Setter
  @Getter
  @NotEmpty
  @ValueOfEnum(enumClass = MyEnum.class)
  private String type;

  public abstract void setValue(T value);
  public abstract T getValue();
}

@Data
class Child extends Parent<Integer> {

  private Integer value;
}
但奇怪的是,我在全局异常处理程序中遇到的错误是
ServerWebInputException
,而实际的异常是
InvalidTypeIdeException

目前,我唯一能做的就是手动解析json:

    String id = request.pathVariable("id");
    request
//        .bodyToMono(Parent.class)
        .bodyToMono(String.class)
        .map(this::mapStringToParent)
        .doOnNext(this::validate)
        // etc...

private Parent mapStringToParent(String str) {
    try {
      return objectMapper.readValue(str, Parent.class);
    } catch (InvalidTypeIdException e) {
      throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Invalid typeId exception");
    } catch (JsonProcessingException ex) {
      throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Json processing exception: " + ex.getMessage());
    }
  }
所以我的问题是:有没有办法在SpringWebFlux应用程序中捕获一些特定的异常,比如
invalidTypeIdeException
,或者更好的方法,为Jackson创建
@ValueOfEnum
类验证器

public class GlobalExceptionHandler extends AbstractErrorWebExceptionHandler {
//some staff here
}
    String id = request.pathVariable("id");
    request
//        .bodyToMono(Parent.class)
        .bodyToMono(String.class)
        .map(this::mapStringToParent)
        .doOnNext(this::validate)
        // etc...

private Parent mapStringToParent(String str) {
    try {
      return objectMapper.readValue(str, Parent.class);
    } catch (InvalidTypeIdException e) {
      throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Invalid typeId exception");
    } catch (JsonProcessingException ex) {
      throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Json processing exception: " + ex.getMessage());
    }
  }