【问题标题】:Fail to send image after setting custom HttpMessageConverter设置自定义 HttpMessageConverter 后发送图片失败
【发布时间】:2015-02-03 21:45:34
【问题描述】:

我已经用 Spring 构建了一个 REST API。大多数控制器返回 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()));
    }
}

图像响应如下(浏览器告诉它返回了数据但无法显示图像)。

我用 Fiddler 检查了响应,这是结果。对于同一张图片,它们是完全不同的。

图片无效:

工作图像:

【问题讨论】:

    标签: java json spring spring-mvc jackson


    【解决方案1】:

    解决方案是添加一个 HttpConverter,它会在 Jackson 转换器获取图像之前适当地处理图像。好在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()));
    }
    

    }

    【讨论】:

    • 当您使用WebMvcConfigurerAdapter.configureMessageConverters 时,没有注册任何默认转换器。所以你可能会再次遇到同样的情况。
    • 那么默认转换器是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    相关资源
    最近更新 更多