Example usage for org.springframework.core.codec Decoder decodeToMono

List of usage examples for org.springframework.core.codec Decoder decodeToMono

Introduction

In this page you can find the example usage for org.springframework.core.codec Decoder decodeToMono.

Prototype

Mono<T> decodeToMono(Publisher<DataBuffer> inputStream, ResolvableType elementType, @Nullable MimeType mimeType,
        @Nullable Map<String, Object> hints);

Source Link

Document

Decode a DataBuffer input stream into a Mono of T .

Usage

From source file:org.springframework.messaging.handler.annotation.support.reactive.PayloadMethodArgumentResolver.java

private Mono<Object> decodeContent(MethodParameter parameter, Message<?> message, boolean isContentRequired,
        Flux<DataBuffer> content, MimeType mimeType) {

    ResolvableType targetType = ResolvableType.forMethodParameter(parameter);
    Class<?> resolvedType = targetType.resolve();
    ReactiveAdapter adapter = (resolvedType != null ? getAdapterRegistry().getAdapter(resolvedType) : null);
    ResolvableType elementType = (adapter != null ? targetType.getGeneric() : targetType);
    isContentRequired = isContentRequired || (adapter != null && !adapter.supportsEmpty());
    Consumer<Object> validator = getValidator(message, parameter);

    Map<String, Object> hints = Collections.emptyMap();

    for (Decoder<?> decoder : this.decoders) {
        if (decoder.canDecode(elementType, mimeType)) {
            if (adapter != null && adapter.isMultiValue()) {
                Flux<?> flux = content
                        .concatMap(buffer -> decoder.decode(Mono.just(buffer), elementType, mimeType, hints))
                        .onErrorResume(ex -> Flux.error(handleReadError(parameter, message, ex)));
                if (isContentRequired) {
                    flux = flux.switchIfEmpty(Flux.error(() -> handleMissingBody(parameter, message)));
                }//from   w w  w.  ja v  a 2  s .  c om
                if (validator != null) {
                    flux = flux.doOnNext(validator::accept);
                }
                return Mono.just(adapter.fromPublisher(flux));
            } else {
                // Single-value (with or without reactive type wrapper)
                Mono<?> mono = decoder.decodeToMono(content.next(), targetType, mimeType, hints)
                        .onErrorResume(ex -> Mono.error(handleReadError(parameter, message, ex)));
                if (isContentRequired) {
                    mono = mono.switchIfEmpty(Mono.error(() -> handleMissingBody(parameter, message)));
                }
                if (validator != null) {
                    mono = mono.doOnNext(validator::accept);
                }
                return (adapter != null ? Mono.just(adapter.fromPublisher(mono)) : Mono.from(mono));
            }
        }
    }

    return Mono.error(new MethodArgumentResolutionException(message, parameter,
            "Cannot decode to [" + targetType + "]" + message));
}