Arrays springcloudopen-Feign:ByteArrayResource的解码器

Arrays springcloudopen-Feign:ByteArrayResource的解码器,arrays,spring-boot,jackson,spring-cloud-feign,downloadfile,openfeign,feign,spring,streamingresponsebody,Arrays,Spring Boot,Jackson,Spring Cloud Feign,Downloadfile,Openfeign,Feign,Spring,Streamingresponsebody,我在一个接口中定义了一个SpringBootRest端点来下载一个映像 @GetMapping(value = "/{name}") ResponseEntity<ByteArrayResource> getFileByName(@PathVariable("name") String name); 调用时,我得到以下错误 com.fasterxml.jackson.core.JsonParseException: Unexpected character ('�' (code 6

我在一个接口中定义了一个SpringBootRest端点来下载一个映像

@GetMapping(value = "/{name}")
ResponseEntity<ByteArrayResource> getFileByName(@PathVariable("name") String name);
调用时,我得到以下错误

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]
当我试图直接从失眠中调用终点时,效果很好。但通过假建设者失败了。响应内容类型为image/jpeg

是否有任何特定的解码器可以通过TearrayResource处理?我尝试了ResponseEntityCoderStreamDecoderJacksonDecoder。这些都不管用

调试时,我看到Jackson ObjectMapper readValue失败。我尝试将返回类型从ByteArraySource更改为byte[],但也没有成功


有什么帮助吗?

我自己写了一个小解码器,问题就解决了。下面是解码器

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);
    }
希望此模板能帮助其他有类似问题的人。本应期望佯装拥有支持所有返回类型的解码器。

谢谢-您的解决方案帮助了我

我修改了您的解决方案,以满足阅读Spring的需要

1.)创建解码器包装器,该包装器返回JacksonDecoder(默认)或将响应库读入字节数组

Decoder decoder = (response, type) -> {
                
                Map<String, Collection<String>> headers = response.headers();
                Collection<String> contentType = null;
                for (String x : headers.keySet()){
                    if ("content-type".equals(x.toLowerCase())){
                        contentType = headers.get(x);                      
                    } 
                }

                if (contentType == null || contentType.stream().filter(x -> x.contains("application/json")).findFirst().isPresent()) {                    
                    return new JacksonDecoder(getMapper()).decode(response, type);
                }

                InputStream initialStream = response.body().asInputStream();
                byte[] buffer = new byte[512];
                byte[] result = null;

                try(ByteArrayOutputStream out = new ByteArrayOutputStream()) {
                    try {
                        int length = 0;
                        while ((length = initialStream.read(buffer)) != -1) {
                            out.write(buffer, 0, length);
                        }
                    } finally {
                        out.flush();
                    }
                    result = out.toByteArray();
                } finally {
                    initialStream.close();
                }

                return result;
            };

请看这个问题:我已经找到了这个链接,但我没有找到任何解决方案,因为Faignit看起来需要使用另一个解码器来响应文件。可能
Jackson解码器
将响应视为
JSON
,这就是它抛出异常的原因。查看文档,如果您的问题得到解决,您应该将问题标记为已接受
Decoder decoder = (response, type) -> {
                
                Map<String, Collection<String>> headers = response.headers();
                Collection<String> contentType = null;
                for (String x : headers.keySet()){
                    if ("content-type".equals(x.toLowerCase())){
                        contentType = headers.get(x);                      
                    } 
                }

                if (contentType == null || contentType.stream().filter(x -> x.contains("application/json")).findFirst().isPresent()) {                    
                    return new JacksonDecoder(getMapper()).decode(response, type);
                }

                InputStream initialStream = response.body().asInputStream();
                byte[] buffer = new byte[512];
                byte[] result = null;

                try(ByteArrayOutputStream out = new ByteArrayOutputStream()) {
                    try {
                        int length = 0;
                        while ((length = initialStream.read(buffer)) != -1) {
                            out.write(buffer, 0, length);
                        }
                    } finally {
                        out.flush();
                    }
                    result = out.toByteArray();
                } finally {
                    initialStream.close();
                }

                return result;
            };
Feign.Builder builder = Feign.builder()
                    // --
                    .decoder(decoder)
                    // --