Skip to content

Commit 622c1b9

Browse files
committed
WebMvc support for SSE Fragment stream
Closes gh-33194
1 parent 184bb7c commit 622c1b9

File tree

3 files changed

+404
-15
lines changed

3 files changed

+404
-15
lines changed

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

+37-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.lang.reflect.Method;
2020
import java.util.ArrayList;
21+
import java.util.Collections;
2122
import java.util.LinkedHashMap;
2223
import java.util.List;
2324
import java.util.Map;
@@ -32,7 +33,10 @@
3233

3334
import org.springframework.beans.factory.BeanFactory;
3435
import org.springframework.beans.factory.BeanFactoryAware;
36+
import org.springframework.beans.factory.BeanFactoryUtils;
3537
import org.springframework.beans.factory.InitializingBean;
38+
import org.springframework.beans.factory.ListableBeanFactory;
39+
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
3640
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
3741
import org.springframework.core.DefaultParameterNameDiscoverer;
3842
import org.springframework.core.KotlinDetector;
@@ -41,6 +45,7 @@
4145
import org.springframework.core.ParameterNameDiscoverer;
4246
import org.springframework.core.ReactiveAdapterRegistry;
4347
import org.springframework.core.annotation.AnnotatedElementUtils;
48+
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
4449
import org.springframework.core.log.LogFormatUtils;
4550
import org.springframework.core.task.AsyncTaskExecutor;
4651
import org.springframework.core.task.SimpleAsyncTaskExecutor;
@@ -96,8 +101,11 @@
96101
import org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite;
97102
import org.springframework.web.method.support.InvocableHandlerMethod;
98103
import org.springframework.web.method.support.ModelAndViewContainer;
104+
import org.springframework.web.servlet.DispatcherServlet;
105+
import org.springframework.web.servlet.LocaleResolver;
99106
import org.springframework.web.servlet.ModelAndView;
100107
import org.springframework.web.servlet.View;
108+
import org.springframework.web.servlet.ViewResolver;
101109
import org.springframework.web.servlet.mvc.annotation.ModelAndViewResolver;
102110
import org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter;
103111
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
@@ -767,7 +775,8 @@ private List<HandlerMethodReturnValueHandler> getDefaultReturnValueHandlers() {
767775
handlers.add(new ModelMethodProcessor());
768776
handlers.add(new ViewMethodReturnValueHandler());
769777
handlers.add(new ResponseBodyEmitterReturnValueHandler(getMessageConverters(),
770-
this.reactiveAdapterRegistry, this.taskExecutor, this.contentNegotiationManager));
778+
this.reactiveAdapterRegistry, this.taskExecutor, this.contentNegotiationManager,
779+
initViewResolvers(), initLocaleResolver()));
771780
handlers.add(new StreamingResponseBodyReturnValueHandler());
772781
handlers.add(new HttpEntityMethodProcessor(getMessageConverters(),
773782
this.contentNegotiationManager, this.requestResponseBodyAdvice, this.errorResponseInterceptors));
@@ -801,6 +810,33 @@ private List<HandlerMethodReturnValueHandler> getDefaultReturnValueHandlers() {
801810
return handlers;
802811
}
803812

813+
private List<ViewResolver> initViewResolvers() {
814+
if (getBeanFactory() instanceof ListableBeanFactory lbf) {
815+
Map<String, ViewResolver> matchingBeans =
816+
BeanFactoryUtils.beansOfTypeIncludingAncestors(lbf, ViewResolver.class, true, false);
817+
if (!matchingBeans.isEmpty()) {
818+
List<ViewResolver> viewResolvers = new ArrayList<>(matchingBeans.values());
819+
AnnotationAwareOrderComparator.sort(viewResolvers);
820+
return viewResolvers;
821+
}
822+
}
823+
return Collections.emptyList();
824+
}
825+
826+
@Nullable
827+
private LocaleResolver initLocaleResolver() {
828+
if (getBeanFactory() != null) {
829+
try {
830+
return getBeanFactory().getBean(
831+
DispatcherServlet.LOCALE_RESOLVER_BEAN_NAME, LocaleResolver.class);
832+
}
833+
catch (NoSuchBeanDefinitionException ex) {
834+
// ignore
835+
}
836+
}
837+
return null;
838+
}
839+
804840
private static Predicate<MethodParameter> methodParamPredicate(
805841
List<HandlerMethodArgumentResolver> resolvers, Class<?> resolverType) {
806842

0 commit comments

Comments
 (0)