Correlated encoding/decoding log messages via hints

Issue: SPR-16966
This commit is contained in:
Rossen Stoyanchev
2018-07-03 20:54:19 -04:00
parent fd90b73748
commit 82310660fd
41 changed files with 293 additions and 152 deletions

View File

@@ -16,8 +16,6 @@
package org.springframework.http.codec;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -26,6 +24,7 @@ import reactor.core.publisher.Mono;
import org.springframework.core.ResolvableType;
import org.springframework.core.codec.Decoder;
import org.springframework.core.codec.Hints;
import org.springframework.http.HttpMessage;
import org.springframework.http.MediaType;
import org.springframework.http.ReactiveHttpInputMessage;
@@ -114,9 +113,8 @@ public class DecoderHttpMessageReader<T> implements HttpMessageReader<T> {
public Flux<T> read(ResolvableType actualType, ResolvableType elementType,
ServerHttpRequest request, ServerHttpResponse response, Map<String, Object> hints) {
Map<String, Object> allHints = new HashMap<>(4);
allHints.putAll(getReadHints(actualType, elementType, request, response));
allHints.putAll(hints);
Map<String, Object> allHints = Hints.merge(hints,
getReadHints(actualType, elementType, request, response));
return read(elementType, request, allHints);
}
@@ -125,9 +123,8 @@ public class DecoderHttpMessageReader<T> implements HttpMessageReader<T> {
public Mono<T> readMono(ResolvableType actualType, ResolvableType elementType,
ServerHttpRequest request, ServerHttpResponse response, Map<String, Object> hints) {
Map<String, Object> allHints = new HashMap<>(4);
allHints.putAll(getReadHints(actualType, elementType, request, response));
allHints.putAll(hints);
Map<String, Object> allHints = Hints.merge(hints,
getReadHints(actualType, elementType, request, response));
return readMono(elementType, request, allHints);
}
@@ -141,10 +138,10 @@ public class DecoderHttpMessageReader<T> implements HttpMessageReader<T> {
ResolvableType elementType, ServerHttpRequest request, ServerHttpResponse response) {
if (this.decoder instanceof HttpMessageDecoder) {
HttpMessageDecoder<?> httpDecoder = (HttpMessageDecoder<?>) this.decoder;
return httpDecoder.getDecodeHints(actualType, elementType, request, response);
HttpMessageDecoder<?> decoder = (HttpMessageDecoder<?>) this.decoder;
return decoder.getDecodeHints(actualType, elementType, request, response);
}
return Collections.emptyMap();
return Hints.none();
}
}

View File

@@ -16,8 +16,6 @@
package org.springframework.http.codec;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -27,6 +25,7 @@ import reactor.core.publisher.Mono;
import org.springframework.core.ResolvableType;
import org.springframework.core.codec.Encoder;
import org.springframework.core.codec.Hints;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
@@ -159,9 +158,8 @@ public class EncoderHttpMessageWriter<T> implements HttpMessageWriter<T> {
ResolvableType elementType, @Nullable MediaType mediaType, ServerHttpRequest request,
ServerHttpResponse response, Map<String, Object> hints) {
Map<String, Object> allHints = new HashMap<>();
allHints.putAll(getWriteHints(actualType, elementType, mediaType, request, response));
allHints.putAll(hints);
Map<String, Object> allHints = Hints.merge(hints,
getWriteHints(actualType, elementType, mediaType, request, response));
return write(inputStream, elementType, mediaType, response, allHints);
}
@@ -175,10 +173,10 @@ public class EncoderHttpMessageWriter<T> implements HttpMessageWriter<T> {
@Nullable MediaType mediaType, ServerHttpRequest request, ServerHttpResponse response) {
if (this.encoder instanceof HttpMessageEncoder) {
HttpMessageEncoder<?> httpEncoder = (HttpMessageEncoder<?>) this.encoder;
return httpEncoder.getEncodeHints(streamType, elementType, mediaType, request, response);
HttpMessageEncoder<?> encoder = (HttpMessageEncoder<?>) this.encoder;
return encoder.getEncodeHints(streamType, elementType, mediaType, request, response);
}
return Collections.emptyMap();
return Hints.none();
}
}

View File

@@ -29,6 +29,7 @@ import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import org.springframework.core.ResolvableType;
import org.springframework.core.codec.Hints;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.http.MediaType;
import org.springframework.http.ReactiveHttpInputMessage;
@@ -108,7 +109,7 @@ public class FormHttpMessageReader extends LoggingCodecSupport
DataBufferUtils.release(buffer);
MultiValueMap<String, String> formData = parseFormData(charset, body);
if (shouldLogRequestDetails()) {
logger.debug("Decoded " + formData);
logger.debug(Hints.getLogPrefix(hints) + "Decoded " + formData);
}
return formData;
});

View File

@@ -29,6 +29,7 @@ import org.reactivestreams.Publisher;
import reactor.core.publisher.Mono;
import org.springframework.core.ResolvableType;
import org.springframework.core.codec.Hints;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.MediaType;
import org.springframework.http.ReactiveHttpOutputMessage;
@@ -131,7 +132,7 @@ public class FormHttpMessageWriter extends LoggingCodecSupport
return Mono.from(inputStream).flatMap(form -> {
if (shouldLogRequestDetails()) {
logger.debug("Encoding " + form);
logger.debug(Hints.getLogPrefix(hints) + "Encoding " + form);
}
String value = serializeForm(form, charset);
ByteBuffer byteBuffer = charset.encode(value);

View File

@@ -16,12 +16,12 @@
package org.springframework.http.codec;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.springframework.core.ResolvableType;
import org.springframework.core.codec.Encoder;
import org.springframework.core.codec.Hints;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
@@ -58,7 +58,7 @@ public interface HttpMessageEncoder<T> extends Encoder<T> {
default Map<String, Object> getEncodeHints(ResolvableType actualType, ResolvableType elementType,
@Nullable MediaType mediaType, ServerHttpRequest request, ServerHttpResponse response) {
return Collections.emptyMap();
return Hints.none();
}
}

View File

@@ -18,8 +18,6 @@ package org.springframework.http.codec;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -31,6 +29,7 @@ import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import org.springframework.core.ResolvableType;
import org.springframework.core.codec.Hints;
import org.springframework.core.codec.ResourceDecoder;
import org.springframework.core.codec.ResourceEncoder;
import org.springframework.core.codec.ResourceRegionEncoder;
@@ -119,7 +118,7 @@ public class ResourceHttpMessageWriter implements HttpMessageWriter<Resource> {
ReactiveHttpOutputMessage message, Map<String, Object> hints) {
HttpHeaders headers = message.getHeaders();
MediaType resourceMediaType = getResourceMediaType(mediaType, resource);
MediaType resourceMediaType = getResourceMediaType(mediaType, resource, hints);
headers.setContentType(resourceMediaType);
if (headers.getContentLength() < 0) {
@@ -129,7 +128,7 @@ public class ResourceHttpMessageWriter implements HttpMessageWriter<Resource> {
}
}
return zeroCopy(resource, null, message)
return zeroCopy(resource, null, message, hints)
.orElseGet(() -> {
Mono<Resource> input = Mono.just(resource);
DataBufferFactory factory = message.bufferFactory();
@@ -138,13 +137,15 @@ public class ResourceHttpMessageWriter implements HttpMessageWriter<Resource> {
});
}
private static MediaType getResourceMediaType(@Nullable MediaType mediaType, Resource resource) {
private static MediaType getResourceMediaType(
@Nullable MediaType mediaType, Resource resource, Map<String, Object> hints) {
if (mediaType != null && mediaType.isConcrete() && !mediaType.equals(MediaType.APPLICATION_OCTET_STREAM)) {
return mediaType;
}
mediaType = MediaTypeFactory.getMediaType(resource).orElse(MediaType.APPLICATION_OCTET_STREAM);
if (logger.isDebugEnabled()) {
logger.debug("Resource associated with '" + mediaType + "'");
logger.debug(Hints.getLogPrefix(hints) + "Resource associated with '" + mediaType + "'");
}
return mediaType;
}
@@ -162,7 +163,7 @@ public class ResourceHttpMessageWriter implements HttpMessageWriter<Resource> {
}
private static Optional<Mono<Void>> zeroCopy(Resource resource, @Nullable ResourceRegion region,
ReactiveHttpOutputMessage message) {
ReactiveHttpOutputMessage message, Map<String, Object> hints) {
if (message instanceof ZeroCopyHttpOutputMessage && resource.isFile()) {
try {
@@ -171,7 +172,7 @@ public class ResourceHttpMessageWriter implements HttpMessageWriter<Resource> {
long count = region != null ? region.getCount() : file.length();
if (logger.isDebugEnabled()) {
String formatted = region != null ? "region " + pos + "-" + (count) + " of " : "";
logger.debug("Zero-copy " + formatted + "[" + resource + "]");
logger.debug(Hints.getLogPrefix(hints) + "Zero-copy " + formatted + "[" + resource + "]");
}
return Optional.of(((ZeroCopyHttpOutputMessage) message).writeWith(file, pos, count));
}
@@ -211,7 +212,7 @@ public class ResourceHttpMessageWriter implements HttpMessageWriter<Resource> {
response.setStatusCode(HttpStatus.PARTIAL_CONTENT);
List<ResourceRegion> regions = HttpRange.toResourceRegions(ranges, resource);
MediaType resourceMediaType = getResourceMediaType(mediaType, resource);
MediaType resourceMediaType = getResourceMediaType(mediaType, resource, hints);
if (regions.size() == 1){
ResourceRegion region = regions.get(0);
@@ -224,26 +225,26 @@ public class ResourceHttpMessageWriter implements HttpMessageWriter<Resource> {
headers.add("Content-Range", "bytes " + start + '-' + end + '/' + contentLength);
headers.setContentLength(end - start + 1);
}
return writeSingleRegion(region, response);
return writeSingleRegion(region, response, hints);
}
else {
String boundary = MimeTypeUtils.generateMultipartBoundaryString();
MediaType multipartType = MediaType.parseMediaType("multipart/byteranges;boundary=" + boundary);
headers.setContentType(multipartType);
Map<String, Object> theHints = new HashMap<>(hints);
theHints.put(ResourceRegionEncoder.BOUNDARY_STRING_HINT, boundary);
return encodeAndWriteRegions(Flux.fromIterable(regions), resourceMediaType, response, theHints);
Map<String, Object> allHints = Hints.merge(hints, ResourceRegionEncoder.BOUNDARY_STRING_HINT, boundary);
return encodeAndWriteRegions(Flux.fromIterable(regions), resourceMediaType, response, allHints);
}
});
}
private Mono<Void> writeSingleRegion(ResourceRegion region, ReactiveHttpOutputMessage message) {
private Mono<Void> writeSingleRegion(ResourceRegion region, ReactiveHttpOutputMessage message,
Map<String, Object> hints) {
return zeroCopy(region.getResource(), region, message)
return zeroCopy(region.getResource(), region, message, hints)
.orElseGet(() -> {
Publisher<? extends ResourceRegion> input = Mono.just(region);
MediaType mediaType = message.getHeaders().getContentType();
return encodeAndWriteRegions(input, mediaType, message, Collections.emptyMap());
return encodeAndWriteRegions(input, mediaType, message, hints);
});
}

View File

@@ -105,7 +105,7 @@ public class ServerSentEventHttpMessageReader implements HttpMessageReader<Objec
boolean shouldWrap = isServerSentEvent(elementType);
ResolvableType valueType = (shouldWrap ? elementType.getGeneric() : elementType);
return stringDecoder.decode(message.getBody(), STRING_TYPE, null, Collections.emptyMap())
return stringDecoder.decode(message.getBody(), STRING_TYPE, null, hints)
.bufferUntil(line -> line.equals(""))
.concatMap(lines -> buildEvent(lines, valueType, shouldWrap, hints));
}

View File

@@ -19,7 +19,6 @@ package org.springframework.http.codec;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -30,6 +29,7 @@ import reactor.core.publisher.Mono;
import org.springframework.core.ResolvableType;
import org.springframework.core.codec.CodecException;
import org.springframework.core.codec.Encoder;
import org.springframework.core.codec.Hints;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.http.MediaType;
@@ -188,9 +188,8 @@ public class ServerSentEventHttpMessageWriter implements HttpMessageWriter<Objec
@Nullable MediaType mediaType, ServerHttpRequest request, ServerHttpResponse response,
Map<String, Object> hints) {
Map<String, Object> allHints = new HashMap<>();
allHints.putAll(getEncodeHints(actualType, elementType, mediaType, request, response));
allHints.putAll(hints);
Map<String, Object> allHints = Hints.merge(hints,
getEncodeHints(actualType, elementType, mediaType, request, response));
return write(input, elementType, mediaType, response, allHints);
}
@@ -199,10 +198,10 @@ public class ServerSentEventHttpMessageWriter implements HttpMessageWriter<Objec
@Nullable MediaType mediaType, ServerHttpRequest request, ServerHttpResponse response) {
if (this.encoder instanceof HttpMessageEncoder) {
HttpMessageEncoder<?> httpEncoder = (HttpMessageEncoder<?>) this.encoder;
return httpEncoder.getEncodeHints(actualType, elementType, mediaType, request, response);
HttpMessageEncoder<?> encoder = (HttpMessageEncoder<?>) this.encoder;
return encoder.getEncodeHints(actualType, elementType, mediaType, request, response);
}
return Collections.emptyMap();
return Hints.none();
}
}

View File

@@ -36,6 +36,7 @@ import org.springframework.core.MethodParameter;
import org.springframework.core.ResolvableType;
import org.springframework.core.codec.CodecException;
import org.springframework.core.codec.DecodingException;
import org.springframework.core.codec.Hints;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.codec.HttpMessageDecoder;
import org.springframework.http.server.reactive.ServerHttpRequest;
@@ -112,7 +113,7 @@ public abstract class AbstractJackson2Decoder extends Jackson2CodecSupport imple
try {
Object value = reader.readValue(tokenBuffer.asParser(getObjectMapper()));
if (logger.isDebugEnabled()) {
logger.debug("Decoded [" + value + "]");
logger.debug(Hints.getLogPrefix(hints) +"Decoded [" + value + "]");
}
return value;
}

View File

@@ -42,6 +42,7 @@ import org.springframework.core.MethodParameter;
import org.springframework.core.ResolvableType;
import org.springframework.core.codec.CodecException;
import org.springframework.core.codec.EncodingException;
import org.springframework.core.codec.Hints;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.http.MediaType;
@@ -141,9 +142,9 @@ public abstract class AbstractJackson2Encoder extends Jackson2CodecSupport imple
private DataBuffer encodeValue(Object value, @Nullable MimeType mimeType, DataBufferFactory bufferFactory,
ResolvableType elementType, @Nullable Map<String, Object> hints, JsonEncoding encoding) {
Log logger = getLogger(hints);
if (logger.isDebugEnabled()) {
logger.debug("Encoding [" + value + "]");
Log theLogger = Hints.getLoggerOrDefault(hints, logger);
if (theLogger.isDebugEnabled()) {
theLogger.debug(Hints.getLogPrefix(hints) + "Encoding [" + value + "]");
}
JavaType javaType = getJavaType(elementType.getType(), null);
@@ -218,7 +219,7 @@ public abstract class AbstractJackson2Encoder extends Jackson2CodecSupport imple
public Map<String, Object> getEncodeHints(@Nullable ResolvableType actualType, ResolvableType elementType,
@Nullable MediaType mediaType, ServerHttpRequest request, ServerHttpResponse response) {
return (actualType != null ? getHints(actualType) : Collections.emptyMap());
return (actualType != null ? getHints(actualType) : Hints.none());
}
// Jackson2CodecSupport ...

View File

@@ -34,6 +34,7 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.core.GenericTypeResolver;
import org.springframework.core.MethodParameter;
import org.springframework.core.ResolvableType;
import org.springframework.core.codec.Hints;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.MimeType;
@@ -98,19 +99,6 @@ public abstract class Jackson2CodecSupport {
return (mimeType == null || this.mimeTypes.stream().anyMatch(m -> m.isCompatibleWith(mimeType)));
}
/**
* Helper method to obtain the logger to use from the Map of hints, or fall
* back on the default logger. This may be used for example to override
* logging, e.g. for a multipart request where the full map of part values
* has already been logged.
* @param hints the hints passed to the encode method
* @return the logger to use
* @since 5.1
*/
protected Log getLogger(@Nullable Map<String, Object> hints) {
return hints != null ? ((Log) hints.getOrDefault(Log.class.getName(), logger)) : logger;
}
protected JavaType getJavaType(Type type, @Nullable Class<?> contextClass) {
TypeFactory typeFactory = this.objectMapper.getTypeFactory();
return typeFactory.constructType(GenericTypeResolver.resolveType(type, contextClass));
@@ -123,10 +111,10 @@ public abstract class Jackson2CodecSupport {
if (annotation != null) {
Class<?>[] classes = annotation.value();
Assert.isTrue(classes.length == 1, JSON_VIEW_HINT_ERROR + param);
return Collections.singletonMap(JSON_VIEW_HINT, classes[0]);
return Hints.from(JSON_VIEW_HINT, classes[0]);
}
}
return Collections.emptyMap();
return Hints.none();
}
@Nullable

View File

@@ -29,7 +29,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.impl.NoOpLog;
import org.reactivestreams.Publisher;
import reactor.core.publisher.Flux;
@@ -38,6 +37,7 @@ import reactor.core.publisher.Mono;
import org.springframework.core.ResolvableType;
import org.springframework.core.codec.CharSequenceEncoder;
import org.springframework.core.codec.CodecException;
import org.springframework.core.codec.Hints;
import org.springframework.core.io.Resource;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
@@ -87,8 +87,7 @@ public class MultipartHttpMessageWriter extends LoggingCodecSupport
public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
/** Suppress logging from individual part writers (full map logged at this level). */
private static final Map<String, Object> DEFAULT_HINTS =
Collections.singletonMap(Log.class.getName(), new NoOpLog());
private static final Map<String, Object> DEFAULT_HINTS = Hints.from(Hints.LOGGER_HINT, new NoOpLog());
private final List<HttpMessageWriter<?>> partWriters;
@@ -191,7 +190,7 @@ public class MultipartHttpMessageWriter extends LoggingCodecSupport
return Mono.from(inputStream).flatMap(map -> {
if (this.formWriter == null || isMultipart(map, mediaType)) {
return writeMultipart(map, outputMessage);
return writeMultipart(map, outputMessage, hints);
}
else {
@SuppressWarnings("unchecked")
@@ -216,7 +215,9 @@ public class MultipartHttpMessageWriter extends LoggingCodecSupport
return false;
}
private Mono<Void> writeMultipart(MultiValueMap<String, ?> map, ReactiveHttpOutputMessage outputMessage) {
private Mono<Void> writeMultipart(
MultiValueMap<String, ?> map, ReactiveHttpOutputMessage outputMessage, Map<String, Object> hints) {
byte[] boundary = generateMultipartBoundary();
Map<String, String> params = new HashMap<>(2);
@@ -226,7 +227,7 @@ public class MultipartHttpMessageWriter extends LoggingCodecSupport
outputMessage.getHeaders().setContentType(new MediaType(MediaType.MULTIPART_FORM_DATA, params));
if (shouldLogRequestDetails()) {
logger.debug("Encoding " + map);
logger.debug(Hints.getLogPrefix(hints) + "Encoding " + map);
}
Flux<DataBuffer> body = Flux.fromIterable(map.entrySet())

View File

@@ -45,6 +45,7 @@ import reactor.core.publisher.FluxSink;
import reactor.core.publisher.Mono;
import org.springframework.core.ResolvableType;
import org.springframework.core.codec.Hints;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.core.io.buffer.DataBufferUtils;
@@ -95,7 +96,7 @@ public class SynchronossPartHttpMessageReader extends LoggingCodecSupport implem
return Flux.create(new SynchronossPartGenerator(message, this.bufferFactory, this.streamStorageFactory))
.doOnNext(part -> {
if (shouldLogRequestDetails()) {
logger.debug("Decoded [" + part + "]");
logger.debug(Hints.getLogPrefix(hints) + "Decoded [" + part + "]");
}
});
}

View File

@@ -40,6 +40,7 @@ import org.springframework.core.ResolvableType;
import org.springframework.core.codec.AbstractDecoder;
import org.springframework.core.codec.CodecException;
import org.springframework.core.codec.DecodingException;
import org.springframework.core.codec.Hints;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
@@ -107,7 +108,7 @@ public class Jaxb2XmlDecoder extends AbstractDecoder<Object> {
return splitEvents.map(events -> {
Object value = unmarshal(events, outputClass);
if (logger.isDebugEnabled()) {
logger.debug("Decoded [" + value + "]");
logger.debug(Hints.getLogPrefix(hints) + "Decoded [" + value + "]");
}
return value;
});

View File

@@ -32,6 +32,7 @@ import org.springframework.core.ResolvableType;
import org.springframework.core.codec.AbstractSingleValueEncoder;
import org.springframework.core.codec.CodecException;
import org.springframework.core.codec.EncodingException;
import org.springframework.core.codec.Hints;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.lang.Nullable;
@@ -74,9 +75,9 @@ public class Jaxb2XmlEncoder extends AbstractSingleValueEncoder<Object> {
protected Flux<DataBuffer> encode(Object value, DataBufferFactory dataBufferFactory,
ResolvableType type, @Nullable MimeType mimeType, @Nullable Map<String, Object> hints) {
try {
Log logger = getLogger(hints);
if (logger.isDebugEnabled()) {
logger.debug("Encoding [" + value + "]");
Log theLogger = Hints.getLoggerOrDefault(hints, logger);
if (theLogger.isDebugEnabled()) {
theLogger.debug(Hints.getLogPrefix(hints) + "Encoding [" + value + "]");
}
DataBuffer buffer = dataBufferFactory.allocateBuffer(1024);
OutputStream outputStream = buffer.asOutputStream();

View File

@@ -44,9 +44,9 @@ import org.springframework.util.MultiValueMap;
public interface ServerWebExchange {
/**
* Name of {@link #getAttributes() attribute} whose value correlates log
* messages for the exchange. Use {@link #getLogPrefix()} to obtain a
* consistently formatted prefix based on this attribute.
* Name of {@link #getAttributes() attribute} whose value can be used to
* correlate log messages for this exchange. Use {@link #getLogPrefix()} to
* obtain a consistently formatted prefix based on this attribute.
* @since 5.1
* @see #getLogPrefix()
*/
@@ -219,9 +219,10 @@ public interface ServerWebExchange {
void addUrlTransformer(Function<String, String> transformer);
/**
* Return a common prefix to use for log messages related to the exchange.
* The prefix is based on the value of the {@link #LOG_ID_ATTRIBUTE}
* attribute along with some extra formatting.
* Return a log message prefix to use to correlate messages for this exchange.
* The prefix is based on the value of the attribute {@link #LOG_ID_ATTRIBUTE}
* along with some extra formatting so that the prefix can be conveniently
* prepended with no further formatting no separatorns required.
* @return the log message prefix or an empty String if the
* {@link #LOG_ID_ATTRIBUTE} is not set.
* @since 5.1

View File

@@ -20,7 +20,6 @@ import java.security.Principal;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -31,6 +30,7 @@ import reactor.core.publisher.Mono;
import org.springframework.context.ApplicationContext;
import org.springframework.context.i18n.LocaleContext;
import org.springframework.core.ResolvableType;
import org.springframework.core.codec.Hints;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
@@ -141,7 +141,7 @@ public class DefaultServerWebExchange implements ServerWebExchange {
.filter(reader -> reader.canRead(FORM_DATA_TYPE, MediaType.APPLICATION_FORM_URLENCODED))
.findFirst()
.orElseThrow(() -> new IllegalStateException("No form data HttpMessageReader.")))
.readMono(FORM_DATA_TYPE, request, Collections.emptyMap())
.readMono(FORM_DATA_TYPE, request, Hints.none())
.switchIfEmpty(EMPTY_FORM_DATA)
.cache();
}
@@ -163,7 +163,7 @@ public class DefaultServerWebExchange implements ServerWebExchange {
.filter(reader -> reader.canRead(MULTIPART_DATA_TYPE, MediaType.MULTIPART_FORM_DATA))
.findFirst()
.orElseThrow(() -> new IllegalStateException("No multipart HttpMessageReader.")))
.readMono(MULTIPART_DATA_TYPE, request, Collections.emptyMap())
.readMono(MULTIPART_DATA_TYPE, request, Hints.none())
.switchIfEmpty(EMPTY_MULTIPART_DATA)
.cache();
}