Вы можете десериализовать ответ JSON самостоятельно. Сначала получите ответ как json String
, а затем выполните десериализацию самостоятельно с помощью предоставленного и настроенного Jackson ObjectMapper
, и, если есть JsonMappingException
, попробуйте его с моделью 2. Это может быть не так эффективно, как это делает пружина внутренне с Jackson2JsonDecoder
, поскольку он обрабатывает InputStream
напрямую, не создавая копию, но это, кажется, единственный способ сделать это с подходом try / catch в настоящее время.
@RestController
class Controller {
private ObjectMapper objectMapper;
public Controller(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
@GetMapping("/handler")
public Mono<Object> getHandler() {
return WebClient
.create("https://baseurl.com")
.get()
.uri("/someUri")
.retrieve()
.bodyToMono(String.class)
.flatMap(json ->
Mono.<Object>fromCallable(() -> objectMapper.readValue(json, Model1.class))
.onErrorResume(JsonMappingException.class, e ->
Mono.fromCallable(() -> objectMapper.readValue(json, Model2.class))
)
);
}
}
Другим решением будет создание базового класса или интерфейса для типов ответов, а затем реализация пользовательского Джексона JsonDeserializer
для него. Это может определить, какой из типов следует использовать, а затем выполнить десериализацию.