Я пробовал различные способы, заданные в Stackoverflow, возможно, я что-то пропустил.
У меня есть клиент Android (код которого я не могу изменить), который в настоящее время получает изображение следующим образом:
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
Где url
- местоположение изображения (статический ресурс на CDN). Теперь моя конечная точка API загрузки Spring должна вести себя как файловый ресурс таким же образом, чтобы один и тот же код мог получать изображения из API (Spring версия для загрузки 1.3.3).
Итак, у меня есть это:
@ResponseBody
@RequestMapping(value = "/Image/{id:.+}", method = RequestMethod.GET, consumes = MediaType.ALL_VALUE, produces = MediaType.IMAGE_JPEG_VALUE)
public ResponseEntity<byte[]> getImage(@PathVariable("id")String id) {
byte[] image = imageService.getImage(id); //this just gets the data from a database
return ResponseEntity.ok(image);
}
Теперь, когда код Android пытается получить http://someurl/image1.jpg
, я получаю эту ошибку в своих журналах:
Разрешение исключения из обработчика [public org.springframework.http.ResponseEntity com.myproject.MyController.getImage(java.lang.String)]: org.springframework.web.HttpMediaTypeNotAcceptableException: не удалось найти приемлемое представление
То же самое происходит при подключении http://someurl/image1.jpg
к браузеру.
Как ни странно, мои тесты проверяются нормально:
Response response = given()
.pathParam("id", "image1.jpg")
.when()
.get("MyController/Image/{id}");
assertEquals(HttpStatus.OK.value(), response.getStatusCode());
byte[] array = response.asByteArray(); //byte array is identical to test image
Как мне заставить это вести себя, как образ, подаваемый обычным способом? (Примечание. Я не могу изменить заголовок содержимого, который отправляет код Android).
ИЗМЕНИТЬ
Код после комментариев (задайте тип контента, выньте produces
):
@RequestMapping(value = "/Image/{id:.+}", method = RequestMethod.GET, consumes = MediaType.ALL_VALUE)
public ResponseEntity<byte[]> getImage(@PathVariable("id")String id, HttpServletResponse response) {
byte[] image = imageService.getImage(id); //this just gets the data from a database
response.setContentType(MediaType.IMAGE_JPEG_VALUE);
return ResponseEntity.ok(image);
}
В браузере это, похоже, дает сжатый барахл (байт, который я думаю). В Android это не ошибка, но изображение не отображается.