/** * Constructor with a fully initialized {@link HttpMessageWriter}. */ public HttpMessageWriterView(HttpMessageWriter<?> writer) { Assert.notNull(writer, "HttpMessageWriter is required"); this.writer = writer; this.canWriteMap = writer.canWrite(ResolvableType.forClass(Map.class), null); }
@Override public void writer(HttpMessageWriter<?> writer) { boolean canWriteObject = writer.canWrite(ResolvableType.forClass(Object.class), null); (canWriteObject ? this.objectWriters : this.typedWriters).add(writer); }
private static <T> HttpMessageWriter<T> findWriter( BodyInserter.Context context, ResolvableType elementType, @Nullable MediaType mediaType) { return context.messageWriters().stream() .filter(messageWriter -> messageWriter.canWrite(elementType, mediaType)) .findFirst() .map(BodyInserters::<T>cast) .orElseThrow(() -> new IllegalStateException( "No HttpMessageWriter for \"" + mediaType + "\" and \"" + elementType + "\"")); }
private List<MediaType> getMediaTypesFor(ResolvableType elementType) { return getMessageWriters().stream() .filter(converter -> converter.canWrite(elementType, null)) .flatMap(converter -> converter.getWritableMediaTypes().stream()) .collect(Collectors.toList()); }
private boolean isMatch(Map.Entry<String, ?> entry) { if (entry.getValue() == null) { return false; } if (!getModelKeys().isEmpty() && !getModelKeys().contains(entry.getKey())) { return false; } ResolvableType type = ResolvableType.forInstance(entry.getValue()); return getMessageWriter().canWrite(type, null); }
@Override public void writer(HttpMessageWriter<?> writer) { boolean canWriteObject = writer.canWrite(ResolvableType.forClass(Object.class), null); (canWriteObject ? this.objectWriters : this.typedWriters).add(writer); }
private static <P extends Publisher<?>, M extends ReactiveHttpOutputMessage> Mono<Void> writeWithMessageWriters( M outputMessage, BodyInserter.Context context, P body, ResolvableType bodyType) { MediaType mediaType = outputMessage.getHeaders().getContentType(); return context.messageWriters().stream() .filter(messageWriter -> messageWriter.canWrite(bodyType, mediaType)) .findFirst() .map(BodyInserters::cast) .map(writer -> write(body, bodyType, mediaType, outputMessage, context, writer)) .orElseGet(() -> Mono.error(unsupportedError(bodyType, context, mediaType))); }
private void assertHasMessageWriter(List<HttpMessageWriter<?>> writers, ResolvableType type, MediaType mediaType) { assertTrue(writers.stream().anyMatch(c -> mediaType == null || c.canWrite(type, mediaType))); }
@Test public void canWrite() { HttpMessageWriter<?> writer = getWriter(MimeTypeUtils.TEXT_HTML); when(this.encoder.canEncode(forClass(String.class), TEXT_HTML)).thenReturn(true); assertTrue(writer.canWrite(forClass(String.class), TEXT_HTML)); assertFalse(writer.canWrite(forClass(String.class), TEXT_XML)); }
.filter(partWriter -> partWriter.canWrite(finalBodyType, contentType)) .findFirst();
@Test public void defaultsOffWithCustomWriters() { Encoder<?> customEncoder1 = mock(Encoder.class); Encoder<?> customEncoder2 = mock(Encoder.class); when(customEncoder1.canEncode(ResolvableType.forClass(Object.class), null)).thenReturn(false); when(customEncoder2.canEncode(ResolvableType.forClass(Object.class), null)).thenReturn(true); HttpMessageWriter<?> customWriter1 = mock(HttpMessageWriter.class); HttpMessageWriter<?> customWriter2 = mock(HttpMessageWriter.class); when(customWriter1.canWrite(ResolvableType.forClass(Object.class), null)).thenReturn(false); when(customWriter2.canWrite(ResolvableType.forClass(Object.class), null)).thenReturn(true); this.configurer.customCodecs().encoder(customEncoder1); this.configurer.customCodecs().encoder(customEncoder2); this.configurer.customCodecs().writer(customWriter1); this.configurer.customCodecs().writer(customWriter2); this.configurer.registerDefaults(false); List<HttpMessageWriter<?>> writers = this.configurer.getWriters(); assertEquals(4, writers.size()); assertSame(customEncoder1, getNextEncoder(writers)); assertSame(customWriter1, writers.get(this.index.getAndIncrement())); assertSame(customEncoder2, getNextEncoder(writers)); assertSame(customWriter2, writers.get(this.index.getAndIncrement())); }
.filter(partWriter -> partWriter.canWrite(finalBodyType, contentType)) .findFirst();
if (writer.canWrite(elementType, bestMediaType)) { return writer.write((Publisher) publisher, actualType, elementType, bestMediaType, request, response, Hints.from(Hints.LOG_PREFIX_HINT, logPrefix));
private List<MediaType> getProducibleMediaTypes(ResolvableType elementType) { return this.codecConfigurer.getWriters() .stream() .filter(converter -> converter.canWrite(elementType, null)) .flatMap(converter -> converter.getWritableMediaTypes().stream()) .collect(Collectors.toList()); }
if (writer.canWrite(bodyType, bestMediaType)) { return ((HttpMessageWriter<Object>) writer).write(publisher, elementType, bestMediaType, exchange.getResponse(), Collections.emptyMap());
@Override public void writer(HttpMessageWriter<?> writer) { boolean canWriteObject = writer.canWrite(ResolvableType.forClass(Object.class), null); (canWriteObject ? this.objectWriters : this.typedWriters).add(writer); }
private static HttpMessageWriter<Resource> resourceHttpMessageWriter(BodyInserter.Context context) { return context.messageWriters().get() .filter(messageWriter -> messageWriter.canWrite(RESOURCE_TYPE, null)) .findFirst() .map(BodyInserters::<Resource>cast) .orElseThrow(() -> new IllegalStateException( "Could not find HttpMessageWriter that supports Resources.")); }
private static <T> HttpMessageWriter<T> sseMessageWriter(BodyInserter.Context context) { return context.messageWriters().get() .filter(messageWriter -> messageWriter .canWrite(SERVER_SIDE_EVENT_TYPE, MediaType.TEXT_EVENT_STREAM)) .findFirst() .map(BodyInserters::<T>cast) .orElseThrow(() -> new IllegalStateException( "Could not find HttpMessageWriter that supports " + MediaType.TEXT_EVENT_STREAM_VALUE)); }
private List<MediaType> getProducibleMediaTypes(ResolvableType elementType) { return getMessageWriters().stream() .filter(converter -> converter.canWrite(elementType, null)) .flatMap(converter -> converter.getWritableMediaTypes().stream()) .collect(Collectors.toList()); }