Skip to content

Commit 79151a0

Browse files
committed
Spring MVC recognizes gRPC streams
For this to work, a compatible message converter is necessary, but only available in spring-grpc. See gh-35401
1 parent 10a288c commit 79151a0

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ReactiveTypeHandler.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)