@@ -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