Spring Cloud Open Feign: декодер для ByteArrayResource - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть конечная точка отдыха Spring Boot, определенная в интерфейсе для загрузки образа

@GetMapping(value = "/{name}")
ResponseEntity<ByteArrayResource> getFileByName(@PathVariable("name") String name);

И я использую Feign Builder для вызова этой конечной точки.

Feign.builder()
    .client(new ApacheHttpClient())
    .contract(new SpringMvcContract())
    .decoder(new JacksonDecoder())
    .encoder(new JacksonEncoder())  
    .target(clazz, url)

При вызове, Я получаю ниже ошибку

com.fasterxml.jackson.core.JsonParseException: Unexpected character ('�' (code 65533 / 0xfffd)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
 at [Source: (BufferedReader); line: 1, column: 2]

Когда я пытаюсь вызвать конечную точку непосредственно из бессонницы, она работает нормально.Но не удается через Feign Builder.Тип содержимого ответа: image / jpeg

Есть ли в feign какой-либо конкретный декодер для обработки ByteArrayResource?Я пытался ResponseEntityDecoder , StreamDecoder и JacksonDecoder .Ничего из этого не работает.

При отладке я вижу, что readValue Jackson ObjectMapper не работает.Я попытался изменить тип возвращаемого значения с ByteArraySource на byte [], тоже не сработало.

Любая помощь?

1 Ответ

0 голосов
/ 25 сентября 2019

Я написал свой собственный маленький декодер, и проблема была решена.Ниже представлен декодер

private Decoder byteArrayResourceDecoder() {
        Decoder decoder = (response, type) -> {
            if (type instanceof Class && ByteArrayResource.class.isAssignableFrom((Class) type)) {
                return StreamUtils.copyToByteArray(response.body().asInputStream());
            }
            return new JacksonDecoder().decode(response, type);
        };

        return new ResponseEntityDecoder(decoder);
    }

Надеюсь, этот шаблон поможет другим, у кого есть похожие проблемы.Предполагалось, что в Feign будет декодер, поддерживающий все типы возвращаемых данных.

...