diff --git a/spring-boot/src/main/java/org/springframework/boot/endpoint/web/jersey/JerseyEndpointResourceFactory.java b/spring-boot/src/main/java/org/springframework/boot/endpoint/web/jersey/JerseyEndpointResourceFactory.java index d32463f712e..6de32a2d3af 100644 --- a/spring-boot/src/main/java/org/springframework/boot/endpoint/web/jersey/JerseyEndpointResourceFactory.java +++ b/spring-boot/src/main/java/org/springframework/boot/endpoint/web/jersey/JerseyEndpointResourceFactory.java @@ -106,12 +106,13 @@ public class JerseyEndpointResourceFactory { private static final List> bodyConverters; static { - bodyConverters = new ArrayList<>(); - bodyConverters.add(new ResourceBodyConverter()); + List> converters = new ArrayList<>(); + converters.add(new ResourceBodyConverter()); if (ClassUtils.isPresent("reactor.core.publisher.Mono", EndpointInvokingInflector.class.getClassLoader())) { - bodyConverters.add(new MonoBodyConverter()); + converters.add(new MonoBodyConverter()); } + bodyConverters = Collections.unmodifiableList(converters); } private final OperationInvoker operationInvoker; @@ -193,11 +194,8 @@ public class JerseyEndpointResourceFactory { } private Object convertIfNecessary(Object body) throws IOException { - if (body instanceof org.springframework.core.io.Resource) { - return ((org.springframework.core.io.Resource) body).getInputStream(); - } - if (body instanceof Mono) { - return ((Mono) body).block(); + for (Function converter : bodyConverters) { + body = converter.apply(body); } return body; } diff --git a/spring-boot/src/main/java/org/springframework/boot/endpoint/web/reactive/WebEndpointReactiveHandlerMapping.java b/spring-boot/src/main/java/org/springframework/boot/endpoint/web/reactive/WebEndpointReactiveHandlerMapping.java index 9462cc566b6..173ce4548fc 100644 --- a/spring-boot/src/main/java/org/springframework/boot/endpoint/web/reactive/WebEndpointReactiveHandlerMapping.java +++ b/spring-boot/src/main/java/org/springframework/boot/endpoint/web/reactive/WebEndpointReactiveHandlerMapping.java @@ -24,6 +24,7 @@ import java.util.Map; import org.reactivestreams.Publisher; import reactor.core.publisher.Mono; +import reactor.core.publisher.MonoSink; import reactor.core.scheduler.Schedulers; import org.springframework.beans.factory.InitializingBean; @@ -212,9 +213,8 @@ public class WebEndpointReactiveHandlerMapping extends RequestMappingInfoHandler return Mono.from(result).map(this::toResponseEntity) .onErrorReturn(ParameterMappingException.class, new ResponseEntity<>(HttpStatus.BAD_REQUEST)) - .defaultIfEmpty( - new ResponseEntity<>(httpMethod == HttpMethod.GET - ? HttpStatus.NOT_FOUND : HttpStatus.NO_CONTENT)); + .defaultIfEmpty(new ResponseEntity<>(httpMethod == HttpMethod.GET + ? HttpStatus.NOT_FOUND : HttpStatus.NO_CONTENT)); } private ResponseEntity toResponseEntity(Object response) { @@ -277,18 +277,20 @@ public class WebEndpointReactiveHandlerMapping extends RequestMappingInfoHandler @Override public Object invoke(Map arguments) { return Mono.create((sink) -> { - Schedulers.elastic().schedule(() -> { - try { - Object result = this.delegate.invoke(arguments); - sink.success(result); - } - catch (Exception ex) { - sink.error(ex); - } - }); + Schedulers.elastic().schedule(() -> invoke(arguments, sink)); }); } + private void invoke(Map arguments, MonoSink sink) { + try { + Object result = this.delegate.invoke(arguments); + sink.success(result); + } + catch (Exception ex) { + sink.error(ex); + } + } + } }