有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在设置自定义HttpMessageConverter后发送图像失败

我已经用Spring构建了一个RESTAPI。大多数控制器返回JSON响应。我还有一个用于获取图像的控制器(它们不能静态引用,因为我必须授权访问它们)

这是我的控制器处理图像的方法:

@RequestMapping("/image/{id}")
@ResponseBody
@PreAuthorize("hasRole('USER')")
public ResponseEntity<byte[]> get(@PathVariable ObjectId id) throws IOException {
    InputStream image = imageRepository.findOne(id);
    if (image == null) {
        throw new Http404Exception("Image not found.");
    }
    final HttpHeaders headers = new HttpHeaders();
    byte[] imageBytes = IOUtils.toByteArray(image);
    headers.setContentType(MediaType.IMAGE_JPEG);
    headers.setContentLength(imageBytes.length);
    return new ResponseEntity<>(imageBytes, headers, HttpStatus.OK);
}

在我需要将Jackson配置为以特定格式返回日期之前,此方法一直有效。在我将以下配置添加为suggested in the docs之后,图像没有正确返回

@Configuration
@EnableWebMvc
public class WebappConfig extends WebMvcConfigurerAdapter {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.simpleDateFormat("yyyy-MM-dd");
        converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
    }
}

图像响应如下(浏览器告知返回数据,但无法显示图像)

browser response

我用Fiddler检查了回复,以下是结果。对于同一个图像,它们是完全不同的

非工作图像:

enter image description here

工作图像:

enter image description here


共 (1) 个答案

  1. # 1 楼答案

    解决方案是添加一个HttpConverter,在Jackson converter访问图像之前,它将适当地处理图像。幸运的是,Spring提供了ByteArrayHttpMessageConverter最终配置:

    @Configuration
    @EnableWebMvc
    public class WebappConfig extends WebMvcConfigurerAdapter {
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
            builder.simpleDateFormat("yyyy-MM-dd");
            converters.add(new ByteArrayHttpMessageConverter());
            converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
    }
    

    }