@Override protected Mono<Void> writeToInternal(ServerWebExchange exchange, Context context) { MediaType contentType = exchange.getResponse().getHeaders().getContentType(); Locale locale = LocaleContextHolder.getLocale(exchange.getLocaleContext()); Stream<ViewResolver> viewResolverStream = context.viewResolvers().stream(); return Flux.fromStream(viewResolverStream) .concatMap(viewResolver -> viewResolver.resolveViewName(name(), locale)) .next() .switchIfEmpty(Mono.error(() -> new IllegalArgumentException("Could not resolve view with name '" + name() + "'"))) .flatMap(view -> { List<MediaType> mediaTypes = view.getSupportedMediaTypes(); return view.render(model(), contentType == null && !mediaTypes.isEmpty() ? mediaTypes.get(0) : contentType, exchange); }); }
@Override public List<HttpMessageWriter<?>> messageWriters() { return context.messageWriters(); } @Override
@Test public void defaultContentType() { Mono<RenderingResponse> result = RenderingResponse.create("view").build(); MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("http://localhost")); TestView view = new TestView(); ViewResolver viewResolver = mock(ViewResolver.class); when(viewResolver.resolveViewName(any(), any())).thenReturn(Mono.just(view)); List<ViewResolver> viewResolvers = new ArrayList<>(); viewResolvers.add(viewResolver); ServerResponse.Context context = mock(ServerResponse.Context.class); when(context.viewResolvers()).thenReturn(viewResolvers); StepVerifier.create(result.flatMap(response -> response.writeTo(exchange, context))) .verifyComplete(); assertEquals(ViewResolverSupport.DEFAULT_CONTENT_TYPE, exchange.getResponse().getHeaders().getContentType()); }
@Override public List<HttpMessageWriter<?>> messageWriters() { return context.messageWriters(); } @Override
@Override public List<HttpMessageWriter<?>> messageWriters() { return context.messageWriters(); } @Override