@@ -81,6 +81,8 @@ class ReactiveTypeHandler {
8181
8282 private static final MediaType WILDCARD_SUBTYPE_SUFFIXED_BY_NDJSON = MediaType .valueOf ("application/*+x-ndjson" );
8383
84+ private static final MediaType APPLICATION_GRPC = MediaType .valueOf ("application/grpc" );
85+
8486 private static final boolean isContextPropagationPresent = ClassUtils .isPresent (
8587 "io.micrometer.context.ContextSnapshot" , ReactiveTypeHandler .class .getClassLoader ());
8688
@@ -165,9 +167,14 @@ public boolean isReactiveType(Class<?> type) {
165167 new SseEmitterSubscriber (emitter , this .taskExecutor , taskDecorator ).connect (adapter , returnValue );
166168 return emitter ;
167169 }
170+ if (mediaTypes .stream ().anyMatch (APPLICATION_GRPC ::includes )) {
171+ ResponseBodyEmitter emitter = getEmitter (mediaType .orElse (APPLICATION_GRPC ));
172+ new BasicEmitterSubscriber (emitter , APPLICATION_GRPC , this .taskExecutor ).connect (adapter , returnValue );
173+ return emitter ;
174+ }
168175 if (CharSequence .class .isAssignableFrom (elementClass )) {
169176 ResponseBodyEmitter emitter = getEmitter (mediaType .orElse (MediaType .TEXT_PLAIN ));
170- new TextEmitterSubscriber (emitter , this .taskExecutor ).connect (adapter , returnValue );
177+ new BasicEmitterSubscriber (emitter , MediaType . TEXT_PLAIN , this .taskExecutor ).connect (adapter , returnValue );
171178 return emitter ;
172179 }
173180 MediaType streamingResponseType = findConcreteJsonStreamMediaType (mediaTypes );
@@ -475,15 +482,18 @@ protected void send(Object element) throws IOException {
475482 }
476483
477484
478- private static class TextEmitterSubscriber extends AbstractEmitterSubscriber {
485+ private static class BasicEmitterSubscriber extends AbstractEmitterSubscriber {
486+
487+ private final MediaType mediaType ;
479488
480- TextEmitterSubscriber (ResponseBodyEmitter emitter , TaskExecutor executor ) {
489+ BasicEmitterSubscriber (ResponseBodyEmitter emitter , MediaType mediaType , TaskExecutor executor ) {
481490 super (emitter , executor , null );
491+ this .mediaType = mediaType ;
482492 }
483493
484494 @ Override
485495 protected void send (Object element ) throws IOException {
486- getEmitter ().send (element , MediaType . TEXT_PLAIN );
496+ getEmitter ().send (element , this . mediaType );
487497 }
488498 }
489499
0 commit comments