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

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

Introduction

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

Prototype

boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType);

Source Link

Document

Whether the decoder supports the given target element type and the MIME type of the source stream.

Usage

From source file:org.springframework.messaging.handler.annotation.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.map(buffer -> decoder.decode(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  .jav  a 2s.  co m
                if (validator != null) {
                    flux = flux.doOnNext(validator);
                }
                return Mono.just(adapter.fromPublisher(flux));
            } else {
                // Single-value (with or without reactive type wrapper)
                Mono<?> mono = content.next()
                        .map(buffer -> decoder.decode(buffer, elementType, 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);
                }
                return (adapter != null ? Mono.just(adapter.fromPublisher(mono)) : Mono.from(mono));
            }
        }
    }

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

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)));
                }//  ww w .ja  v  a  2s . 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));
}