Java 设置自定义HttpMessageConverter后无法发送图像
我已经用Spring构建了一个RESTAPI。大多数控制器返回JSON响应。我还有一个用于获取图像的控制器,它们不能静态引用,因为我必须授权访问它们 这是我的控制器处理图像的方法:Java 设置自定义HttpMessageConverter后无法发送图像,java,json,spring,spring-mvc,jackson,Java,Json,Spring,Spring Mvc,Jackson,我已经用Spring构建了一个RESTAPI。大多数控制器返回JSON响应。我还有一个用于获取图像的控制器,它们不能静态引用,因为我必须授权访问它们 这是我的控制器处理图像的方法: @RequestMapping("/image/{id}") @ResponseBody @PreAuthorize("hasRole('USER')") public ResponseEntity<byte[]> get(@PathVariable ObjectId id) throws IOExcep
@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配置为以特定格式返回日期之前,此方法一直有效。在我将以下配置添加为之后,图像没有正确返回
@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检查了回复,以下是结果。对于同一个图像,它们是完全不同的
非工作图像:
工作图像:
解决方案是添加一个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()));
}
}使用WebMVCConfigureAdapter.configureMessageConverters时,默认转换器均未注册。因此,你可能会再次遇到同样的情况。那么,默认情况是什么呢?