@Override public Mono<Void> handleResult(ServerWebExchange exchange, HandlerResult result) { ResolvableType returnType = result.getReturnType(); MethodParameter bodyType; Mono<?> returnValueMono; Optional<Object> optionalValue = result.getReturnValue(); Class<?> rawClass = returnType.getRawClass(); ReactiveAdapter adapter = getAdapterRegistry().getAdapterFrom(rawClass, optionalValue); if (adapter != null) { returnValueMono = adapter.toMono(optionalValue); bodyType = new MethodParameter(result.getReturnTypeSource()); bodyType.increaseNestingLevel(); bodyType.increaseNestingLevel(); } else { returnValueMono = Mono.justOrEmpty(optionalValue); bodyType = new MethodParameter(result.getReturnTypeSource()); bodyType.increaseNestingLevel(); } return returnValueMono.then( returnValue -> { Assert.isInstanceOf(HttpEntity.class, returnValue); HttpEntity<?> httpEntity = (HttpEntity<?>) returnValue; if (httpEntity instanceof ResponseEntity) { ResponseEntity<?> responseEntity = (ResponseEntity<?>) httpEntity; exchange.getResponse().setStatusCode(responseEntity.getStatusCode()); } HttpHeaders entityHeaders = httpEntity.getHeaders(); HttpHeaders responseHeaders = exchange.getResponse().getHeaders(); if (!entityHeaders.isEmpty()) { entityHeaders .entrySet() .stream() .filter(entry -> !responseHeaders.containsKey(entry.getKey())) .forEach(entry -> responseHeaders.put(entry.getKey(), entry.getValue())); } return writeBody(httpEntity.getBody(), bodyType, exchange); }); }