В Spring MVC, как я могу установить заголовок типа mime при использовании @ResponseBody

У меня есть Spring MVC Controller, который возвращает строку JSON, и я хотел бы установить mimetype в application / json. Как я могу это сделать?

@RequestMapping(method=RequestMethod.GET, value="foo/bar") @ResponseBody public String fooBar(){ return myService.getJson(); } 

Бизнес-объекты уже доступны как строки JSON, поэтому использование MappingJacksonJsonView для меня не является решением. @ResponseBody отлично, но как я могу установить mimetype?

Я бы подумал реорганизовать службу, чтобы вернуть объект домена, а не строки JSON, и пусть Spring обрабатывает сериализацию (через MappingJacksonHttpMessageConverter при написании). Начиная с весны 3.1 реализация выглядит довольно аккуратно:

 @RequestMapping(produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.GET value = "/foo/bar") @ResponseBody public Bar fooBar(){ return myService.getBar(); } 

Комментарии:

Во-первых, в конфигурацию вашего приложения необходимо добавить или @EnableWebMvc .

Затем атрибут @RequestMapping annotations @RequestMapping используется для указания типа содержимого ответа. Следовательно, он должен быть установлен в MediaType.APPLICATION_JSON_VALUE (или "application/json" ).

Наконец, jackson должен быть добавлен так, что любая сериализация и де-сериализация между Java и JSON будут обрабатываться автоматически весной (зависимость jacksonа определяется весной, а MappingJacksonHttpMessageConverter будет находиться под капотом).

Используйте ResponseEntity вместо ResponseBody . Таким образом, у вас есть доступ к заголовкам ответов, и вы можете установить соответствующий тип контента. Согласно документам Spring :

HttpEntity похож на @RequestBody и @ResponseBody . Помимо получения доступа к телу запроса и ответа, HttpEntity (и специфический для ResponseEntity подclass ResponseEntity ) также обеспечивает доступ к заголовкам запроса и ответа

Код будет выглядеть так:

 @RequestMapping(method=RequestMethod.GET, value="/fooBar") public ResponseEntity fooBar2() { String json = "jsonResponse"; HttpHeaders responseHeaders = new HttpHeaders(); responseHeaders.setContentType(MediaType.APPLICATION_JSON); return new ResponseEntity(json, responseHeaders, HttpStatus.CREATED); } 

Возможно, вы не сможете сделать это с помощью @ResponseBody, но что-то вроде этого должно работать:

 package xxx; import java.io.ByteArrayOutputStream; import java.io.IOException; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class FooBar { @RequestMapping(value="foo/bar", method = RequestMethod.GET) public void fooBar(HttpServletResponse response) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); out.write(myService.getJson().getBytes()); response.setContentType("application/json"); response.setContentLength(out.size()); response.getOutputStream().write(out.toByteArray()); response.getOutputStream().flush(); } } на package xxx; import java.io.ByteArrayOutputStream; import java.io.IOException; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class FooBar { @RequestMapping(value="foo/bar", method = RequestMethod.GET) public void fooBar(HttpServletResponse response) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); out.write(myService.getJson().getBytes()); response.setContentType("application/json"); response.setContentLength(out.size()); response.getOutputStream().write(out.toByteArray()); response.getOutputStream().flush(); } } 

Я не думаю, что это возможно. Кажется, для него открытая Джира:

SPR-6702: явно задать ответ Content-Type в @ResponseBody

Зарегистрируйте org.springframework.http.converter.json.MappingJacksonHttpMessageConverter как конвертер сообщений и верните объект непосредственно из метода.

           

и controller:

 @RequestMapping(method=RequestMethod.GET, value="foo/bar") public @ResponseBody Object fooBar(){ return myService.getActualObject(); } 

Для этого требуется зависимость org.springframework:spring-webmvc .

Я не думаю, что вы можете, кроме response.setContentType(..)

Моя версия реальности. Загрузка HTML-файла и streamовая передача в браузер.

 @Controller @RequestMapping("/") public class UIController { @RequestMapping(value="index", method=RequestMethod.GET, produces = "text/html") public @ResponseBody String GetBootupFile() throws IOException { Resource resource = new ClassPathResource("MainPage.html"); String fileContents = FileUtils.readFileToString(resource.getFile()); return fileContents; } } 
  • Весенний совет АОП по аннотированным controllerам
  • Как отправить список объектов для просмотра и возврата к методу Post в controllerе
  • Как работает аннотация «Spring @ResponseBody» в этом примере приложения RESTful?
  • Использование переменной env в приложении Spring Boot.properties
  • Загрузка многостраничного файла с использованием шаблона Spring Rest + Spring Web MVC
  • Как обрабатывать MaxUploadSizeExceededException
  • как установить заголовок без кэша весной mvc 3 по annotations
  • При использовании Spring Security, каков правильный способ получить текущее имя пользователя (например, SecurityContext) в компоненте?
  • Как читать атрибуты flash после перенаправления в Spring MVC 3.1?
  • Spring MVC - AngularJS - Загрузка файлов - org.apache.commons.fileupload.FileUploadException
  • Как использовать атрибуты сеанса в Spring-mvc
  • Interesting Posts

    Как очистить кеш окна DNS

    Словарь в Swift с Mutable Array как значение работает очень медленно? Как оптимизировать или построить правильно?

    Различные типы ярлыков

    При редактировании документа в Word 2007 документ внезапно становится только для чтения

    Как сделать контрольную сумму SHA1 в C #?

    Как использовать константу PI в C ++

    Как выбрать компоненты JSF с помощью jQuery?

    Ошибка Inflating class com.google.android.maps.MapView

    Как запросить пользователя для целевого хоста в Ansible?

    Должен ли я отключить файл подкачки, если у меня много ОЗУ или я должен переместить его на виртуальный RAM-диск?

    Дублирование строки с формулами без изменения ссылок на ячейки

    Весна-прототип ботинка в одиночном тоне

    Соединение wi-fi периодически падает на несколько секунд

    Могу ли я изменить среду для каждого процесса в Windows (например, в Unix)?

    Невозможно найти подходящую версию для установки углового крепления

    Давайте будем гением компьютера.