Эта ошибка не связана с оператором onErrorMap
. Этот код не компилируется, потому что компилятор не может вывести универсальный тип, возвращаемый методом Mono.fromSupplier
, равным Void
- вы возвращаете нуль в предоставленной функции.
Это должно быть исправлено следующим образом:
@PostMapping(value="/hello", consumes="application/json")
public Mono<Void> sayHello(@Valid String msg) {
log.info("Message is {}", msg);
return Mono.<Void>fromSupplier(() -> {
client.hello(msg);
return null;
}).onErrorMap(e->{
HttpStatus status = e.status() ==0 } HttpStatus.SERVICE_UNAVAILABLE : HttpStatus.valueOf(e.status());
String message = e.getMessage();
return new ResponseStatusException(status, message);
});
}
Я думаю, что более логично делать следующее:
@PostMapping(value="/hello", consumes="application/json")
public Mono<Void> sayHello(@Valid String msg) {
log.info("Message is {}", msg);
return Mono.fromRunnable(() -> {
client.hello(msg);
})
.then()
.onErrorMap(e->{
HttpStatus status = e.status() ==0 } HttpStatus.SERVICE_UNAVAILABLE : HttpStatus.valueOf(e.status());
String message = e.getMessage();
return new ResponseStatusException(status, message);
});
}
Наконец, я бы посоветовал не использовать блокировку вызовов внутри реактивного конвейера, если только вам это не нужно. (предпочтительнее WebClient или другой неблокирующий HTTP-клиент, чем блокировать клиентов как симулированные).