Как добавить pdf / byte [] программу чтения сообщений в exchangeStrategies, тип контента 'application / pdf' не поддерживается - PullRequest
0 голосов
/ 29 ноября 2018

я не могу сделать правильное использование веб-службы pdf rest с помощью webClient (webflux)

вот мое создание webClient:

ExchangeStrategies pdfExchangeStrategy = ExchangeStrategies
                        .builder()
                        .codecs(
                                        clientCodecConfigurer -> {
                                            CustomCodecs customCodecs = clientCodecConfigurer.customCodecs();
                                            final ByteArrayDecoder byteArrayDecoder = new ByteArrayDecoder(){

                                                @Override
                                                public List<MimeType> getDecodableMimeTypes() {
                                                    return Collections.singletonList(APPLICATION_PDF);
                                                }
                                            };
                                            customCodecs.decoder(byteArrayDecoder);
                                            customCodecs.encoder(new ByteArrayEncoder());
                                            DecoderHttpMessageReader pdfReader = new DecoderHttpMessageReader(byteArrayDecoder);
                                            customCodecs.reader(pdfReader);
                                        }
                        )
                        .build();
        this.webClient = webClientFactory
                        .newBuilder(logger, "My web client")
                        .exchangeStrategies(pdfExchangeStrategy)
                        .defaultHeader(ACCEPT, APPLICATION_PDF_VALUE)
                        .defaultHeader(CONTENT_TYPE, APPLICATION_PDF_VALUE)
                        .baseUrl(this.baseUrl)
                        .build();

и вот мой звонок:

webClient.get()
                 .uri("http://localhost:8084/my-app/document/{id}", id)
                 .accept(APPLICATION_PDF)
                 .retrieve()
                 .bodyToMono(Byte[].class)
                 .block();

я получаю эту ошибку:

org.springframework.web.reactive.function.UnsupportedMediaTypeException: Content type 'application/pdf' not supported

, хотя в supportMediaTypes у меня есть application / pdf

использованный веб-сервис:

@GetMapping(value = "/document/{id}", produces = APPLICATION_PDF_VALUE)
    public ResponseEntity<byte[]> getDocument(@PathVariable String id) throws IOException {
        LOGGER.info("get  document with id =  {}", id);
        byte[] pdf = getInvoicePdf("document/sample.pdf");
        HttpHeaders headers = new HttpHeaders();
        headers.setContentDispositionFormData("filename",  id + ".pdf");
        headers.setContentType(APPLICATION_PDF);
        headers.setContentLength(pdf.length);
        return ResponseEntity
                        .ok()
                        .headers(headers)
                        .body(pdf);
    }

спасибо за вашу помощь

1 Ответ

0 голосов
/ 29 ноября 2018

Наконец, нет необходимости во всем этом шаблоне exchangeStrategies, все, что нужно для решения этой проблемы:

        webClient.get()
                 .uri("http://localhost:8084/my-app/document/{id}", id)
                 .accept(APPLICATION_PDF)
                 .exchange()
                 .block()
                 .bodyToMono(byte[].class)
                 .block()
...