Java 如何在SpringWebFlux中处理/捕获特定于框架的异常
我有一个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({ @
@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());
}
}